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

Proper way to run managable background thread with QThread

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

我阅读了文档,我能找到的最好方法是 subclass QThread 并重新实现 运行() 方法:

class BackgroundThread: public QThread
{
   Q_OBJECT

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

我喜欢这个,因为我可以 运行 在单独的线程中编写代码,而且我不需要使用 moveToThread 和最多连接 10 个 signals/slots 来执行不方便的 Qt 魔法来正确管理线程资源。

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

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

你不需要任何魔法和“10 signals/slots”。只需创建您的工人:

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