使用QThread运行可管理后台线程的正确方式
Proper way to run managable background thread with QThread
我需要运行一些后台线程,这些线程必须是可管理的,这样我就可以随时安全地停止它。线程应该做一些可重复的任务。
我阅读了文档,我能找到的最好的方法是将QThread子类化并重新实现run()方法:
class BackgroundThread: public QThread
{
Q_OBJECT
virtual void run() Q_DECL_OVERRIDE
{
while (true)
{
// do some routine task
// sleep ...
}
}
};
我喜欢这一点,因为我可以在单独的线程中运行代码,而且我不需要用moveToThread和连接多达10个信号/插槽来正确管理线程资源来实现令人难以置信的Qt魔术。
问题是我找不到安全地停止线程的方法。我不想在随机执行的地方终止它,我希望它在下一次迭代结束时停止。我现在看到的实现它的唯一方法是向线程类添加一些原子标志,并在需要停止它时从主线程设置它,但我真的不喜欢这个解决方案。
使用Qt5实现可管理后台线程的最佳方式是什么?
您不需要任何魔法和"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
子类化?
相关文章:
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 如何以线程安全的方式更改目录?
- 等待线程的最佳方式是什么
- 如何使用 pthreads 以正确的方式设置两个线程之一的优先级
- 可能以有效的方式在模拟的循环中进行多线程
- 最理想的情况是,如果一个变量在多个线程中读取,但只在一个线程中写入,那么它是否应该在写入线程中以非原子方式读取
- 从多个线程收集结果的缓存友好方式
- 多线程 UI 的最佳方式
- 从线程更新进度条的最佳方式
- 使用QThread运行可管理后台线程的正确方式
- 导入 DLL 的工作方式不同(VS2003 到 VS2010,多线程到多线程 DLL)
- C++/Win32 我在 Windows 2000+ 上启动线程的最佳方式
- ACE互斥锁是如何工作的,以及为什么ACE线程互斥锁的工作方式不同
- 如何以线程安全的方式退出 C++03 中的程序
- Eclipse CDT 多线程调试不是最佳的 - 如何以独占方式运行线程
- 以线程安全的方式每秒打印队列的当前元素数
- 提升线程 - 安全/有保证的处理线程中断的方式
- 是否可以以编程方式冻结 Windows 上的线程