17

私は現在、次のような方法を持っています

void SomeMethod(int a)
{

     //Delay for one sec.
     timer->start(1000);

     //After one sec
     SomeOtherFunction(a);
}

このメソッドは、実際にはシグナルに接続されたスロットです。Qtimer を使用して 1 秒の遅延を追加したいと思いますが、これを達成する方法がわかりません。タイマーは終了時にシグナルをトリガーするため、シグナルはパラメーターを取り込まない別のメソッドにアタッチする必要があります。このタスクを達成する方法について何か提案はありますか?

更新: シグナルは 1 秒間に複数回呼び出され、遅延は 1 秒間になります。ここでの問題は、タイマーの timeout() シグナルに接続されたスロットにパラメーターを渡すことです。私の最後のアプローチは、クラスのメンバー変数に値を格納し、ミューテックスを使用して、変数が使用されている間に変更されないようにすることです.しかし、私はここでより単純な方法を探しています.

4

4 に答える 4

54

実際、メンバー変数やキューを必要としない、質問に対するより洗練された解決策があります。Qt 5.4 と C++11 では、メソッドから直接ラムダ式を実行QTimer::singleShot(..)できます! Qt 5.0 ~ 5.3 を使用している場合は、connect メソッドを使用して QTimer のタイムアウト シグナルを、適切なパラメータで遅延させる必要があるメソッドを呼び出す Lambda 式に接続できます。

編集: Qt 5.4 リリースでは、たった 1 行のコードです!

Qt 5.4 (およびそれ以降)

void MyClass::SomeMethod(int a) {
  QTimer::singleShot(1000, []() { SomeOtherFunction(a); } );
}

Qt 5.0 - 5.3

void MyClass::SomeMethod(int a) {
  QTimer *timer = new QTimer(this);
  timer->setSingleShot(true);

  connect(timer, &QTimer::timeout, [=]() {
    SomeOtherFunction(a);
    timer->deleteLater();
  } );

  timer->start(1000);
}
于 2013-08-14T18:11:11.307 に答える
1

SomeMethod1 秒間に複数回呼び出しを行い、遅延が常に一定である場合は、パラメータaを に配置し、QQueueを呼び出すためのシングル ショット タイマーを作成して、SomeOtherFunctionからパラメータを取得することができますQQueue

void SomeClass::SomeMethod(int a)
{
    queue.enqueue(a);
    QTimer::singleShot(1000, this, SLOT(SomeOtherFunction()));
}

void SomeClass::SomeOtherFunction()
{
    int a = queue.dequeue();
    // do something with a
}
于 2013-08-14T16:42:03.620 に答える
0

QTimer::startはブロックされていないため、機能しません。

でタイマーを開始しQTimer::singleShot、QTimer がタイムアウトした後に実行されるスロットに接続する必要があります。

于 2013-08-14T19:52:56.410 に答える