c++ - 使用 QThread 运行可管理后台线程的正确方法

标签 c++ qt5 qthread

我需要运行几个后台线程,这些线程必须是可管理的,以便我可以随时安全地停止它。线程应该做一些可重复的任务。

我阅读了文档,我能找到的最好方法是子类化 QThread 并重新实现 run() 方法:

class BackgroundThread: public QThread
{
   Q_OBJECT

   virtual void run() Q_DECL_OVERRIDE
   {
       while (true)
       {
          // do some routine task
          // sleep ...
       }  
   }
};

我喜欢这个,因为我可以在单独的线程中运行代码,而且我不需要使用 moveToThread 和连接多达 10 个信号/插槽来正确管理线程资源。

问题是我找不到安全停止线程的方法。我不想在随机执行的地方终止它,我希望它在下一次迭代结束时停止。我现在看到的实现它的唯一方法是向线程类添加一些原子标志,并在我需要停止它时从主线程设置它,但我真的不喜欢这个解决方案。

使用 Qt5 实现可管理后台线程的最佳方法是什么?

最佳答案

您不需要任何魔法和“10 个信号/插槽”。只需创建您的 worker :

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

关于c++ - 使用 QThread 运行可管理后台线程的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37167927/

相关文章:

c++ - 从另一个函数获取 char[] 的方法很好。开始用 c/c++ 思考

c++ - 在 Go 应用程序中使用 C(++) 提高性能

c++ - 将 Qt DLL 保存在单独的文件夹中

c++ - QGroupBox 单击/焦点

python - PyQt4 线程正确

c++ - 从不同的 QThread 访问 QObject 方法的安全性

c++ - 如何运行一段代码,使其不会在 QtQuick 中窃取所有焦点?

c++ - 派生类对象是否包含基类对象?

c++ 17:仅 header :类静态变量错误

c++ - 从 QwtPlotZoomer 派生的类未按预期工作