1

メインスレッドを停止し、数秒後に再起動する機能を作りたいです。私は次のことを試しました:

void Mainwindow::timeout()
{
    QTimer timer;
    timer.setSingleShot(true);
    timer.setInterval(time*1000);
    connect(&timer,SIGNAL(timeout()),MainWindow::thread(),SLOT(start()));

    timer.start();

    SuspendThread(MainWindow::thread());
}

残念ながら、これはあまり効果がありません...ヒントはありますか?

4

3 に答える 3

3

タイマー オブジェクトは関数の最後で破棄されるため、そのシグナルを発信Mainwindow::timeout()することはありません。timeout()

于 2013-02-06T14:41:22.437 に答える
3

何かを見落としているのかもしれませんが、「[...] 停止して数秒後に再起動する機能」のように聞こえsleep()ます。車輪を再発明するのではなく、OS にタイミングを任せます。

または、メイン スレッドにメッセージを投稿できない理由がありますか? この単純な使用例では、単一のミューテックスを介しても十分でしょう。別のスレッドからミューテックスを設定し、メイン スレッドのイベント ループで確認し、場合によってはsleep()直接呼び出します。

メインスレッドが他のスレッドによってその場でサスペンドされるのではなく、喜んでスリープ状態になる単一の場所があるため、デバッグも容易になります。

于 2013-02-06T14:53:54.740 に答える
2

イベント ループを停止する理由はわかりませんが、ロックされたミューテックスを x ミリ秒間待機することで、スレッドをスリープ状態にすることができます。

以下のコードではwaitCondition.wait(&mutex, msecs);、条件変数を最大msecsミリ秒待機するために使用します。ミューテックスがロックされているため、ウェイクアップ信号を送信する別のスレッドがないため、スレッドがtimeoutミリ秒間ブロックされます。参考はこちら

#include <QWaitCondition>
#include <QMutex>

class Sleep
{
public:
    static void msleep(unsigned long msecs)
    {
        QMutex mutex;
        mutex.lock();

        QWaitCondition waitCondition;
        waitCondition.wait(&mutex, msecs);

        mutex.unlock(); // Not necessary since new mutex will always be created,
                        // but since destroying locked mutex
                        // is bringing undefined behavior, let's follow some ethics 
    }
};
于 2013-02-06T14:11:02.350 に答える