我是 Qt 的新手,想了解有关 QThread 实例管理的线程的自定义调度的推荐方法。
我想要一个调度程序线程,它响应应用程序状态的变化,使某些线程进入睡眠状态或改变它们的优先级。调度应该是抢先式的,因为我应该能够让某些工作人员(可能正在等待互斥体)进入睡眠状态并稍后调用它们。
我特别好奇的是,为什么 QThread::sleep 和相关函数都受到保护?
如果不能通过 Qt 线程类获得对调度的细粒度控制,那么我想知道其他可能性。
我是 Qt 的新手,想了解有关 QThread 实例管理的线程的自定义调度的推荐方法。
我想要一个调度程序线程,它响应应用程序状态的变化,使某些线程进入睡眠状态或改变它们的优先级。调度应该是抢先式的,因为我应该能够让某些工作人员(可能正在等待互斥体)进入睡眠状态并稍后调用它们。
我特别好奇的是,为什么 QThread::sleep 和相关函数都受到保护?
如果不能通过 Qt 线程类获得对调度的细粒度控制,那么我想知道其他可能性。
那么有没有办法让其他线程休眠并稍后唤醒它们?
在下班时让线程休眠通常不是完成您需要的最有效或最干净的方法。您通常希望在线程有工作时保持活动状态,并在它们没有工作时销毁它们(而不是迫使停滞的线程反复休眠)。在 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 还提供了额外的线程机制(利用信号和槽),如QThreadPool或QtConcurrent命名空间中的任何东西。