C++ Qt应用程序中线程的自定义调度

C++ Qt应用程序中线程的自定义调度,c++,multithreading,qt,C++,Multithreading,Qt,我是Qt的新手,希望了解关于定制由QThread实例管理的线程调度的推荐方法 我希望有一个调度程序线程,它响应应用程序状态的变化,将某些线程置于睡眠状态或更改其优先级。调度应该是先发制人的,因为我应该能够使某些工作者(可能正在等待互斥)进入睡眠状态,并在以后调用它们 我特别好奇的是为什么QThread::sleep和相关函数受到保护 如果不能通过Qt线程类获得对调度的细粒度控制,那么我想知道其他的可能性 那么,是否存在让其他线程睡眠并在稍后唤醒它们的方法呢 起来 让线程在不工作时休眠通常不是完成

我是Qt的新手,希望了解关于定制由QThread实例管理的线程调度的推荐方法

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

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

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


那么,是否存在让其他线程睡眠并在稍后唤醒它们的方法呢 起来

让线程在不工作时休眠通常不是完成所需任务的最有效或最干净的方法。您通常希望线程在工作时保持活动状态,在不工作时销毁它们(而不是强迫停滞的线程反复休眠)。Qt中管理线程的惯用方法是利用signal/slot接口来促进线程的创建和销毁

下面是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还提供了额外的线程机制(利用信号和插槽),例如命名空间中的任何线程。

sleep
msleep
usleep
将当前运行的线程置于睡眠状态,他们不会告诉其他线程睡眠。那么有没有办法让其他线程睡眠,然后再唤醒它们呢?听起来像是XY问题。“你通常希望线程有工作时保持活动状态,没有工作时销毁它们(而不是强迫停滞的线程反复睡眠)“您知道,向被阻塞的线程发送信号要比持续创建/终止/销毁线程快得多(也更安全)。”?