7

「タイムアウト」信号/スロット機能でQtのタイマーを停止しても安全ですか?QTimerに関するQtドキュメントに情報が見つからないようです。

サーバーに「keepalive」メッセージを定期的に送信するタイマーを作成しました。メッセージの送信中に何らかのエラーが発生した場合は、このタイマーを停止したいと思います。

private:
   QTimer* mpKeepAliveTimer;

タイマーは次のように初期化されます。

mpKeepAliveTimer = new QTimer(/* this */);

QObject::connect(mpKeepAliveTimer, SIGNAL(timeout()), this, SLOT(OnKeepAlive()));

mpKeepAliveTimer->start(KEEP_ALIVE_PERIOD);

このように停止しました:

if (mpKeepAliveTimer != NULL) // <-- Edited
{
    if (mpKeepAliveTimer->isActive() == true)
        mpKeepAliveTimer->stop();

    delete mpKeepAliveTimer;
    mpKeepAliveTimer = NULL;
}

タイムアウト関数は次のようになります。

void Classname::OnKeepAlive()
{
   if (isErrorFound == true)
      mpKeepAliveTimer->stop();   // <---- IS THIS SAFE?
}

ありがとう。

4

1 に答える 1

7

キュー接続を明示的に使用していない限り、これは安全です。
これは、emit timeout()接続されているすべてのスロットが処理されるまで関数が戻らないためです。

ただし、キュー接続を使用している場合、理論的には、イベントキューに未処理のタイムアウトイベントが残っている可能性があるため、非常に安全にするために、次を使用できます。

void Classname::OnKeepAlive()
{
    if (!mpKeepAliveTimer || !mpKeepAliveTimer->isActive()) return;

    if (isErrorFound)
    {
        mpKeepAliveTimer->stop();
    }
}

!= NULL停止関数の条件は、の代わりに使用する必要があることに注意してください== NULL。ただし、その関数は次のように記述することもできます。

if (mpKeepAliveTimer)
{
    delete mpKeepAliveTimer;
    mpKeepAliveTimer = NULL;
}

コメントですでに示唆されているように、QTimerはデストラクタで停止します。

于 2012-08-16T07:35:03.100 に答える