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

Proper way to run managable background thread with QThread

本文关键字:方式 线程 后台 QThread 运行 管理 使用      更新时间:2023-10-16

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

我阅读了文档,我能找到的最好的方法是将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子类化?