我需要运行一些后台线程,这些后台线程必须是可管理的,我可以随时安全地停止它。线程应该做一些可重复的任务。
我阅读文档,我能找到的最佳方法是继承QThread并重新实现run()方法:
class BackgroundThread: public QThread
{
Q_OBJECT
virtual void run() Q_DECL_OVERRIDE
{
while (true)
{
// do some routine task
// sleep ...
}
}
};
我喜欢这个,因为我可以在单独的线程中运行代码,并且我不需要使用moveToThread执行不兼容的Qt魔术,并且最多可以连接10个信号/插槽来正确管理线程资源。
问题在于我无法找到安全停止线程的方法。我不希望在随机执行的地方终止它,我希望它在下一次迭代结束时停止。我现在看到的唯一获得它的方法是向线程类添加一些原子标志,并在需要停止时从主线程设置它,但我真的不喜欢这个解决方案。
使用Qt5实现可管理后台线程的最佳方法是什么?
答案 0 :(得分:1)
你不需要任何魔法和“10个信号/插槽”。只需创建你的工作人员:
class Worker: public QObject
{
...
public slots:
void routineTask();
}
代码中的某处:
QThread bckgThread;
bckgThread.start();
Worker worker;
worker.moveToThread(&bckgThread);
将一些信号连接到routineTask
插槽以进行呼叫或使用QMetaObject::invokeMethod
。
完成线程后,只需调用:
bckgThread.quit();
bckgThread.wait();
这是非常简单的模式。为什么要走硬路和子类QThread
?