I know, there are some similar questions to the following out there, but I couldn't find a concrete answer that helps me. So here's my problem:
I work on an application that does some gui-initialisations on start up. One of the things I have to do, is calling
NetworkConfigurationManager::updateConfigurations ()
This is a asynchronous call, which emits the updateCompleted()
signal, when it is finished. The problem is, that all my other gui-initialisations have to wait until the updateConfigurations()
is finished.
So what I could do would be something like this:
MyApp::MyApp(QWidget *parent) : ....
{
doSomeInits();
//Now connect the signal we have to wait for
connect(configManager, SIGNAL(updateCompleted()), this, SLOT(networkConfigurationUpdated()));
configManager->updateConfigurations(); //call the async function
}
void MyApp::networkConfigurationUpdated()
{
doSomething();
doRemainingInitsThatHadToWaitForConfigMgr();
}
To split up the initialisation doesn't seem a good way to me. I think it makes the code much harder to read - inits should remain together. The other thing is: Because updateConfiguration()
is asynchronous, the user will be able to use the GUI, which doesn't give him any information yet, cause we are waiting for updateCompleted()
.
So is there a way to wait for the updateCompleted()
signal, before the application continues?
like:
MyApp::MyApp(QWidget *parent) : ....
{
doSomeInits();
//Now connect the signal we have to wait for
connect(configManager, SIGNAL(updateCompleted()), this, SLOT(doSomething()));
???? //wait until doSomething() is done.
doRemainingInitsThatHadToWaitForConfigMgr();
}
In some APIs there are blocking alternatives to asynchronous functions, but not in this case.
I appreciate any help. Thanks!