在Qt应用程序中自定义线程调度

时间:2013-03-10 19:36:13

标签: c++ multithreading qt

我是Qt的新手,想了解QThread实例管理的线程自定义调度的推荐方法。

我想有一个调度程序线程,它响应应用程序状态的变化,将某些线程置于休眠状态或更改其优先级。调度应该是先发制人的,因为我应该能够让某些工作人员(可能正在等待互斥锁)进入睡眠状态并稍后调用它们。

我特别好奇的是为什么QThread :: sleep和相关功能受到保护?

如果无法通过Qt线程类获得对调度的细粒度控制,那么我想知道其他可能性。

1 个答案:

答案 0 :(得分:0)

  

所以有没有办法让其他线程睡眠,然后唤醒它们   起来?

让线程在失业时睡觉通常不是最有效或最干净的方式来完成你所需要的。您通常希望线程在工作时保持活动状态,并在不执行时将其销毁(而不是强制停滞线程重复睡眠)。在Qt中管理线程的惯用方法是利用信号/插槽接口来促进线程的创建和销毁。

以下是QThread文档中的一个简单示例,该文档显示了如何使用Qt的这一特性来处理线程调度,而几乎没有外部干预:

 class Worker : public QObject
 {
     Q_OBJECT

 public slots:
     void doWork() {
         ...
     }
 };

 void MyObject::putWorkerInAThread()
 {
     Worker *worker = new Worker;
     QThread *workerThread = new QThread(this);

     connect(workerThread, SIGNAL(started()), worker, SLOT(doWork()));
     connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
     worker->moveToThread(workerThread);

     // Starts an event loop, and emits workerThread->started()
     workerThread->start();
 }

对于更高级的线程方案,Qt还提供了额外的线程机制(利用信号和插槽),如QThreadPoolQtConcurrent命名空间中的任何内容。