0

私は常にすべてのアプリケーションでQObject::connect()を使用していますが、プログラムが現在関数内にある場合の効果はわかりません。次のコードがあるとします。

void main() {
    //other stuffs here
    QObject::connect(xxx,SIGNAL(yyy()),this,SLOT(zzz());
}

void aFunction()
{
    //a bunch of codes here

    //i am here when suddenly signal is emitted from QObject::connect();

    //another bunch of codes here
}

シグナルが発信されると、QObject :: connectは関数「aFunction()」を離れて「zzz()」を実行すると思います。「aFunction()」の残りのコードはどうなりますか

ありがとう。

4

1 に答える 1

0

手続き型からイベントベースのプログラミングに移行すると、あなたと同じような経験が得られるので、混乱は理解できます。

簡単な答え: 非マルチスレッド環境では、終了zzz()後にスロットが実行されaFunction()ます。実際、シグナルはおそらく aFunction の終了後に発行されます。マルチスレッド環境では、同じことですが、「しばらくしてから」であり、後ではありません。

これを理解する鍵は、イベント ループです。QApplication::exec()イベントの永久ループ ポーリングを実行します。次に、新しいイベントが処理され、シグナルが発行され、その 5 番目の引数QObject::connectが aであることに応じてQt::ConnectionType、最終的に接続されたスロットが実行されます。詳細については、QObject のドキュメントを参照してください。

したがって、aFunctionおそらく何らかのシグナルの後に呼び出されるため、終了後、再びイベントループに戻り、「突然発信された」シグナルが実際に発信さzzzれて実行されます。

マルチスレッド環境でも、スレッド間シグナルとスロットはQt::QueuedConnection基本的に対応するスレッドに発行されたシグナルを投稿するだけで機能し、そのスレッドのイベントループがそれを処理するために来ると、同様に順次実行されます。

最終的に覚えておかなければならないことは、コンピューターと呼ばれるこのチューリング マシンがコードのシーケンスを実行しているということです。コードが送信される部分 (または分散? またはフェッチ?) からその実行までは、常にシーケンスで実行されるか、複数の実行ノードでコードが 2 回実行されないように、1 つまたは複数の方法でシーケンシャルになるようにシミュレートする必要があります。

「いきなり」はない

于 2012-07-22T10:06:12.993 に答える