0

私は Qt の初心者であり、QThread インスタンスによって管理されるスレッドのカスタム スケジューリングに対する推奨アプローチについて知りたいと考えています。

アプリケーションの状態の変化に応じて、特定のスレッドをスリープ状態にするか、優先度を変更するスケジューラ スレッドが必要です。スケジューリングは、特定のワーカー (ミューテックスで待機している可能性があります) をスリープ状態にして後で呼び出すことができるように、プリエンプティブにする必要があります。

私が特に興味を持っているのは、QThread::sleep および関連する関数が保護されている理由です。

Qt のスレッド化クラスではスケジューリングをきめ細かく制御できない場合は、別の可能性について知りたいと思います。

4

1 に答える 1

0

他のスレッドをスリープさせ、後でそれらを起こす方法はありますか?

仕事をしていないときにスレッドをスリープ状態にすることは、通常、必要なことを達成するための最も効率的または最もクリーンな方法ではありません。通常、スレッドが動作している間はスレッドを存続させ、動作していない場合はスレッドを破棄します (停滞しているスレッドを繰り返しスリープさせるのではなく)。Qt でスレッドを管理する慣用的な方法は、シグナル/スロット インターフェイスを利用して、スレッドの作成と破棄を容易にすることです。

これは、Qt のこの機能を使用して、外部からの介入をほとんど必要とせずにスレッド スケジューリングを処理する方法を示す QT​​hread ドキュメントの簡単な例です。

 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名前空間の何かのような追加のスレッド メカニズム (シグナルとスロットを利用する) も提供します。

于 2013-03-10T23:35:45.990 に答える