QT线程的“暂停”和“恢复”

#include <QThread>
#include <QMutex>
#include <QWaitCondition>

class ITask : public QThread
{
	Q_OBJECT
public:
	enum TaskStatus {Idel,Running,Paused,Finished}
	//.... 构造构析构
	//.... IsRunning() ..Is....
	virtual void Start(){
		if(IsRunning())
			return;
		m_state = Running;
		m_bQuit = false;
		start();
	}
	virtual void Stop(){
		if(IsPaused())
			Resume();
		m_bQuit = true;
	}
	void Pause(){
		if(IsRunning(){
			m_sync.lock();
			m_state = Paused;
			m_sync.unlock();
		}
	}
	bool Resume(){
		if(IsRunning())
			return true;
		if(IsPaused(){
			m_sync.lock();
			m_state = Running;
			m_sync.unlock();
			m_cond.wakeOne();
			return true;
		}
		return false;
	}
signals:
	void sig_threadStatusChanged(int sts);
protected:
	virtual void run() override{
		while(!m_bQuit && !isInterruptionRequested())
		{
			waitHandle();
			process();
		}
		m_bQuit = true;
		m_state = Finished;
	}
	virtual void process(){}
	void waitHandle(){
		m_sync.lock();
		if(m_needPause){
			m_state = Paused;
			m_cond.wait(&m_sync);
		}
	}
private:
	bool m_bQuit{false};
	bool m_needPause{false};
	TaskStatus m_sts {Idel};
	QMutex m_sync;
	QWaitCondition m_cond;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用Qt的多线程机制来实现任务的暂停恢复和终止功能。以下是一个基本的示例代码: ```cpp #include <QThread> #include <QMutex> #include <QDebug> // 自定义的工作线程类 class WorkerThread : public QThread { public: // 构造函数 WorkerThread(QObject *parent = nullptr) : QThread(parent), m_paused(false), m_terminated(false) {} // 提供外部控制线程暂停的方法 void pause() { QMutexLocker locker(&m_mutex); m_paused = true; } // 提供外部控制线程恢复的方法 void resume() { QMutexLocker locker(&m_mutex); m_paused = false; m_condition.wakeAll(); } // 提供外部控制线程终止的方法 void terminate() { QMutexLocker locker(&m_mutex); m_terminated = true; m_condition.wakeAll(); } protected: // 线程执行函数 void run() override { int count = 0; while (true) { // 检查是否被暂停或终止 QMutexLocker locker(&m_mutex); if (m_paused) { m_condition.wait(&m_mutex); // 等待恢复信号 } if (m_terminated) { break; } // 执行任务 qDebug() << "Count:" << count++; msleep(1000); // 休眠1秒 } } private: QMutex m_mutex; QWaitCondition m_condition; bool m_paused; bool m_terminated; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建并启动工作线程 WorkerThread workerThread; workerThread.start(); // 模拟控制任务的暂停恢复和终止 QTimer timer; timer.setInterval(3000); // 3秒后暂停任务 QObject::connect(&timer, &QTimer::timeout, [&workerThread]() { qDebug() << "Pausing task..."; workerThread.pause(); }); timer.start(); QTimer timer2; timer2.setInterval(6000); // 6秒后恢复任务 QObject::connect(&timer2, &QTimer::timeout, [&workerThread]() { qDebug() << "Resuming task..."; workerThread.resume(); }); timer2.start(); QTimer timer3; timer3.setInterval(9000); // 9秒后终止任务 QObject::connect(&timer3, &QTimer::timeout, [&workerThread]() { qDebug() << "Terminating task..."; workerThread.terminate(); }); timer3.start(); return a.exec(); } ``` 在上面的示例中,我们创建了一个名为`WorkerThread`的自定义线程类,它继承自`QThread`。该类提供了三个方法来控制线程暂停恢复和终止。 在`run()`函数中,我们使用一个无限循环来执行任务。在每次循环开始时,我们检查是否被暂停或终止。如果被暂停,则调用`m_condition.wait(&m_mutex)`等待恢复信号。如果被终止,则跳出循环,结束线程。 在主函数中,我们创建并启动了一个`WorkerThread`实例,并使用`QTimer`模拟控制任务的暂停恢复和终止。通过设置不同的定时器间隔,可以调整任务的执行时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值