次のリンクから、QThread をサブクラス化することは正しい使用方法ではないことを学びます...適切な方法は、QObject をサブクラス化し、moveToThread() 関数を使用して QObject クラスのオブジェクトをそれぞれのスレッドに移動することです...私は次のリンクをたどりました.. リンク1とリンク2 ...しかし、私の質問は、msleep()とusleep()で保護された静的関数をどのように使用できるのでしょうか? または、QTimerを使用してスレッドをしばらく待機させますか?
4 に答える
タイマーは必要ありません。待機のために、Qt は QWaitCondition を提供します。次のようなものを実装できます。
#include <QWaitCondition>
#include <QMutex>
void threadSleep(unsigned long ms)
{
QMutex mutex;
mutex.lock();
QWaitCondition waitCond;
waitCond.wait(&mutex, ms);
mutex.unlock();
}
これは正常な機能です。もちろん、必要に応じてメンバー関数として実装することもできます (static
その場合はメンバーにすることができます)。
1 つの解決策は、タイマーを作成することです。
class Worker: public QObject
{
///...
private slots:
void doWork()
{
//...
QTimer::singleShot(delay, this, SLOT(continueDoingWork()));
}
void continueDoingWork()
{
}
};
場合によっては、別のスレッドで操作を実行するだけでよく、このすべてのイベント ループとスレッドがオーバーヘッドになります。QtConcurent
次に、フレームワークを使用できます。
class Worker
{
public:
void doWork()
{
//...
}
} worker;
//...
QtConcurent::run(worker, &Worker::doWork);
次に、通常はミューテックスを使用してスリープ操作をシミュレートします。
QMutex m;
m.lock();
m.tryLock(delay);
標準的な答えは、「シグナルとスロットを使用する」です。
たとえば、スレッド内の QObject を一定時間後に「起動」させたい場合は、QTimer::singleShot()を考えて、スロットを 3 番目の引数として渡します。これは、問題のスロットから呼び出すことができ、定期的に実行されます。
このスレッドの協力なしに別のスレッドをスリープさせることはできません。これがメンバー関数QThread
が保護されている理由です。別のスレッドをスリープさせたい場合は、内部で条件変数またはタイマーを使用する必要があります
で現在のスレッドをスリープさせたい場合、最も簡単な方法はそれをサブクラス化することです -スレッドローカルイベントループなどをusleep()
必要としない限り、それはまったく問題ありません。QThreadPool