4

1 つのスレッドがemit signal1();

2 番目のスレッドは、emit signal2();最初のスレッドがシグナルを送信した後に実行します (両方のスレッドで呼び出しを発行する前にロックされた同じミューテックスがあり、ログに記録しました。最初のスレッドが 2 番目のスレッドの前にロックを取得したことをログで確認できます)

最初のスレッドと 2 番目のスレッド、または GUI スレッドではありません。

signal1 のスロットが signal2 のスロットの前に呼び出されるという保証はありますか?

4

3 に答える 3

6

エミッターとレシーバー オブジェクトは異なるスレッドで実行されているため、スロットは同期的に実行されません。Qt はデフォルトで、直接接続ではなくキュー接続を使用しています。ただし、接続時にブロッキング キュー接続を使用して同期実行を強制することができます (さまざまな接続タイプの説明については、 http: //qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enumも参照してください)。シグナルとスロット。

しかし、ブロッキング キュー接続にはコストがかかります。エミッタ スレッドは、接続されたすべてのスロットが実行されるまでブロックされます。これは必ずしも良い考えではありません。ただし、非ブロッキング接続を使用する場合、実行の順序は、スロットが実行されたオブジェクトによって異なります。

考慮すべき重要なことは、各 QThread には独自のイベント キューがあるということです。これは、特定のスレッドのスロットに対してのみ実行順序が保証されることを意味します。つまり、次のケースを考慮する必要があります。

  • signal1 のスロットと signal2 のスロットは、同じスレッド内にある QObject で定義されています。この場合、同じイベント キューによってトリガーされるため、スロットが期待される順序で実行されることを確認できます。
  • 両方のスロットが異なるスレッドで実行されています。ここでは、シグナルが 2 つの独立したイベント キューにポストされるため、実行順序を制御することはできません。この場合、ミューテックスまたは待機条件を使用する (またはブロッキング接続を使用する) 必要があります。
于 2012-11-18T23:14:10.590 に答える
1

emitMeta Object Compiler (moc) によって生成された .cpp を見てください。

したがって、emit signal1();としてコンパイルされsignal1();、質問への答えは「はい」ですが、もちろん、signal1() の実行が signal2() の呼び出し前に終了するという保証はありません。

于 2012-11-05T11:21:39.677 に答える
1

私があなたを正しく理解しているかどうかはわかりませんが、これはあなたを助けるかもしれません:

シグナルが発行されると、それに接続されているスロットは、通常の関数呼び出しと同じように、通常すぐに実行されます。

http://doc.qt.io/qt-5/signalsandslots.htmlから

したがって、emit() を呼び出すことは、他の関数を呼び出すことと考えてください。

于 2012-11-05T11:16:55.077 に答える