他のスレッドをスリープさせ、後でそれらを起こす方法はありますか?
仕事をしていないときにスレッドをスリープ状態にすることは、通常、必要なことを達成するための最も効率的または最もクリーンな方法ではありません。通常、スレッドが動作している間はスレッドを存続させ、動作していない場合はスレッドを破棄します (停滞しているスレッドを繰り返しスリープさせるのではなく)。Qt でスレッドを管理する慣用的な方法は、シグナル/スロット インターフェイスを利用して、スレッドの作成と破棄を容易にすることです。
これは、Qt のこの機能を使用して、外部からの介入をほとんど必要とせずにスレッド スケジューリングを処理する方法を示す QThread ドキュメントの簡単な例です。
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名前空間の何かのような追加のスレッド メカニズム (シグナルとスロットを利用する) も提供します。