19

この種の main() を使用した Qt アプリケーションがあります...

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow   mainWin;

    ... A separate, non-GUI thread is launched here

    mainWin.Init();
    mainWin.show();

    app.exec();
}

mainWin が mainWin との通信をいつ開始できるかを知る必要がある前に作成されるこの別のスレッド。しかし、mainWin は Qt シグナル、スロット、タイマーなどを使用するため、(exec() を介して) イベント ループが実行されるまで、本当にロックする準備ができているわけではありません。

私の質問は: イベント ループが開始されたときに発行される信号またはイベントはありますか?

このことを考慮。mainWin.Init() では、QTimer のようなものを作成し、.start() を呼び出して開始することもできます。ただし、 exec() が呼び出されるまで、実際には実行されず、イベントがトリガーされません。これが、イベント ループがいつ実際に開始されたかを知る必要がある理由です。

4

3 に答える 3

15

exec()呼び出しの前にウィンドウにシグナルを送信できます。appこれにより、のシグナル キューにエントリが配置されます。がexec()実行されると、シグナルが配信され、ウィンドウはイベント ループが実行されていることを認識します。

簡単な方法はQTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted()));、ウィンドウ クラスのカスタム スロットに接続する which を使用することです。

于 2012-01-16T09:32:15.157 に答える
2

イベント ループがまだ実行されていないときに発行されたシグナルが失われないため、スレッドは、ウィンドウの準備ができていることを必ずしも知る必要はありません。
スレッドはすぐにウィンドウのシグナルの送信を開始できますが、イベント ループの実行中にのみウィンドウからシグナルを受信します。

于 2012-01-16T09:44:51.343 に答える
1

次の順序で実行できます。

QApplication app(argc, argv);
Mainwinwdow mainWin;
QThread yourThread;

//connect the signals from the thread to the mainWin here

mainWin.Init();
mainWin.show();

yourThread.start();

return app.exec();
于 2012-01-16T09:03:39.493 に答える