QT多线程实现任务暂停恢复与终止功能
时间: 2023-12-21 09:38:44 浏览: 156
QT多线程
5星 · 资源好评率100%
你可以使用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`模拟控制任务的暂停、恢复和终止。通过设置不同的定时器间隔,可以调整任务的执行时间。
阅读全文