Suspended + Resume in QT threads

Однажды я убил много времени по поиску ответа на вопрос как приостановить и возобновить поток в QT. Сам QThread таких методов не имеет, по той причине что QT кроссплатформенный, а данные функции имеет только Windows, поэтому придется создавать свой велосипед.

Первое что нам понадобится, это подключить заголовки класса QEventLoop.

Используется данный класс таким образом

QEventLoop loop;
connect(this, SIGNAL(PauseBreak()), &loop, SLOT(quit()));
loop.exec();

Смысл прост, в нужном месте инициализируем класс, конектим сигнал для слота quit() и вызываем метод exec(); который и приостановит наш поток до тех пор пока мы мне отправим сигнал PauseBreak()

ниже я предоставил свой класс в котором реализован более удобный функционал основанный на методах, можете пользоваться им , или можете посмотреть и сделать на свой вкус.

Thread.h


#ifndef WORKTHREAD_H
#define WORKTHREAD_H

#include <QObject>
#include <QThread>
#include <QEventLoop>

class MainWindow;
class WorkThread: public QThread
{
Q_OBJECT

public:
WorkThread();
void run() override;

void Start();
void Pause();
void Resume();
void Exit();
private:


bool PauseOrExit();
bool isExit;
bool isPause;

signals:

void PauseBreak(void);

public slots:

};

#endif // WORKTHREAD_H

 

Thread.cpp


#include "workthread.h"
#include "mainwindow.h"

WorkThread::WorkThread()
{
}
void WorkThread::run(){

while(true){

if(PauseOrExit()){ // проверяем на паузу или выход
return;
}
// что-то делаем
}

}


void WorkThread::Start(){
isPause = false;
isExit = false;
start();
}
void WorkThread::Pause(){
isPause = true;
}
void WorkThread::Resume(){
isPause = false;
emit PauseBreak();
}
void WorkThread::Exit(){
if(isFinished()){
return;
}
isExit = true;

if (isPause) {
isPause = false;
emit PauseBreak();
}

}
bool WorkThread::PauseOrExit(){

if (isPause) {
QEventLoop loop;
connect(this, SIGNAL(PauseBreak()), &loop, SLOT(quit()));
loop.exec();
} 
if( isExit ){ 
return 1; 
} 
return 0; 
} 

 

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *