1

(遅延ビデオ ストリームに基づいて) 時間に非常に敏感な結果プログラムを開発していますが、信号とスロットが Qt 内でどのように実装されているかがわからないため、いつ実行されるかわかりません。それらはコールバックのように本当にリアルタイムで実行されますか、それともある種のメイン ループの次の繰り返しの前に処理されますか?

私の質問は、特にタイマーに関するものです。タイマーがタイムアウトしたとき (別のスレッドである必要があります)、割り込みのように「瞬時に」信号に接続しますか (次の命令など)。いくつかのループの終わり?

あなたの洞察をありがとう、

よろしく、 ミスター・ミステール

4

4 に答える 4

3

QObject::connect の最後の引数は、スロットがいつ実行されるかを決定する接続タイプです。ドキュメントから:

  • Qt::AutoConnection - シグナルが受信オブジェクトとは異なるスレッドから送信された場合、シグナルはキューに入れられ、Qt::QueuedConnection として動作します。それ以外の場合、スロットは直接呼び出され、Qt::DirectConnection として動作します。接続のタイプは、信号が発信されたときに決定されます。

  • Qt::DirectConnection - シグナルが発行されると、スロットはすぐに呼び出されます。

  • Qt::QueuedConnection - コントロールがレシーバーのスレッドのイベント ループに戻ると、スロットが呼び出されます。スロットは受信側のスレッドで実行されます。

  • Qt::BlockingQueuedConnection - QueuedConnection と同じですが、スロットが戻るまで現在のスレッドがブロックされます。この接続タイプは、エミッターとレシーバーが異なるスレッドにある場合にのみ使用してください。

于 2013-06-13T20:08:43.137 に答える
2

タイマーが別のスレッドに実装されているのではなく、イベント ループ内で処理されていることは確かです。つまり、タイマーが起動すると、すぐに接続されます。ただし、タイマーが起動する粒度が主な問題です。

タイマーが別のスレッドでシグナルを発行する場合、受信オブジェクトが属するスレッドでスロットが呼び出されます。これは、イベント ループに延期されることを意味します。(ご覧のとおり、タイマーを独自のスレッドで動作させることは役に立ちません。)

于 2013-06-13T19:41:50.590 に答える
2

http://woboq.com/blog/how-qt-signals-slots-work.html

詳しく読んだわけではありませんが、これはかなり良い説明のようです。

要点: 直接接続と遅延接続があります。直接接続はすぐに実行されます。

于 2013-06-13T19:00:58.027 に答える
1

さらに、Qt5 では QTimer の精度を設定できます: Qt::TimerType

于 2013-06-13T19:47:34.443 に答える