Однажды я убил много времени по поиску ответа на вопрос как приостановить и возобновить поток в 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; }
555