Is there notification when event loop starts?
-
I have a Qt application with this kind of main()...
@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(); }@
This other thread that is created before the mainWin needs to know when it can start communicating with the mainWin. But since the mainWin uses Qt signals, slots, timers, etc, it's not truly ready to rock until the event loop is running (via exec()).
My question is: is there some signal or event that is emitted when the event loop has started?
Consider this. In mainWin.Init(), you can create something like a QTimer and even call .start() to kick it off. But it won't actually be run and trigger events until exec() has been called. This is why I need to know when the event loop has truly started.
-
You can easily create such notification with QMetaObject::invokeMethod() called with Qt::QueuedConnection connection type. Something like this:
@
// separate thread is launched here
QMetaObject::invokeMethod( notifier, SLOT(notifyThread()), Qt::QueuedConnection );
return app.exec();@notifier->notifyThread() will be queued for execution and will be executed when main event loop starts.
-
[quote author="p-himik" date="1326702789"]You can easily create such notification with QMetaObject::invokeMethod() called with Qt::QueuedConnection connection type. Something like this:
@
// separate thread is launched here
QMetaObject::invokeMethod( notifier, SLOT(notifyThread()), Qt::QueuedConnection );
return app.exec();@notifier->notifyThread() will be queued for execution and will be executed when main event loop starts.[/quote]
This would not work, as it would be executed when the thread event loop runs, not the main one.
[quote author="Volker" date="1326715140"]A common solution is to use a single shot timer:
@
int main(int argc, const char* argv[])
{
QApplication a(argc, argv);
MyThread thread;
QTimer::singleShot(0, &thread, SLOT(startYourWork()));// .... a.exec();
}
@
[/quote]Take care, where the slot is executed. This one will be executed in the main thread if thread is not moved to itself. If it is moved, the same as the upper comment comes into the game, the thread event loop would be taken, the gui event loop might not have started.
-
[quote author="Gerolf" date="1326716683"]This would not work, as it would be executed when the thread event loop runs, not the main one.
[/quote]Sorry I didn't write it but notifier is a separate object created in main() which only purpose is to notify separate thread.
-
[quote author="Volker" date="1326716983"]
[quote author="Gerolf" date="1326716683"]
Take care, where the slot is executed. This one will be executed in the main thread if thread is not moved to itself.
[/quote]"You're doing it wrong™":/wiki/Threads_Events_QObjects :-)
[/quote]I did not say do it, I just mentioned the possible problems :-)
-
[quote author="Gerolf" date="1326717793"][quote author="Volker" date="1326716983"]
[quote author="Gerolf" date="1326716683"]
Take care, where the slot is executed. This one will be executed in the main thread if thread is not moved to itself.
[/quote]"You're doing it wrong™":/wiki/Threads_Events_QObjects :-)
[/quote]I did not say do it, I just mentioned the possible problems :-)[/quote]
Agreed. But one has those with every signal/slot connection once threads are involved.