【问题标题】:Custom scheduling of threads in Qt applicationQt 应用程序中线程的自定义调度
【发布时间】:2013-03-10 19:36:12
【问题描述】:

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

我想要一个调度程序线程,它可以响应应用程序状态的变化,使某些线程进入睡眠状态或改变它们的优先级。调度应该是抢先式的,因为我应该能够让某些工作人员(可能正在等待互斥体)进入睡眠状态并稍后调用它们。

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

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

【问题讨论】:

  • sleep, msleepusleep 让当前运行的线程休眠,它们不会告诉其他线程休眠。
  • 那么有没有办法让其他线程休眠然后唤醒它们?
  • 听起来像是 XY 问题。

标签: c++ multithreading qt


【解决方案1】:

那么是否存在让其他线程休眠并稍后唤醒它们的方法 起来了吗?

在下班时让线程休眠通常不是完成所需任务的最有效或最干净的方法。您通常希望在线程有工作时保持活动状态,并在它们没有工作时销毁它们(而不是迫使停滞的线程反复休眠)。在 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 命名空间中的任何内容。

【讨论】:

  • '您通常希望线程有工作时保持活动状态,而在没有工作时销毁它们(而不是迫使停滞的线程反复休眠)。您是否知道,与不断创建/终止/销毁线程相比,向阻塞的线程发出信号要快得多(也更安全)?
猜你喜欢
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多