我知道,已经有一些类似下面的问题,但我找不到一个能帮助我的具体答案。所以这是我的问题:
我正在开发一个应用程序,在启动时进行一些GUI初始化操作。其中一件我必须做的事情是调用
NetworkConfigurationManager::updateConfigurations ()
这是一个异步调用,在完成后会触发updateCompleted()
信号。问题在于,直到updateConfigurations()
完成之前,所有其他GUI初始化都必须等待。
所以我可以做的是:
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();
}
在我的看法中,分割初始化过程不是一个好的方法。我认为这会使代码变得更加难以阅读 - 初始化应该放在一起。另一件事情是:因为updateConfiguration()
是异步的,用户将能够使用GUI,但此时还没有任何信息可供他使用,因为我们正在等待updateCompleted()
。
那么有没有一种方法可以在应用程序继续之前等待updateCompleted()
信号呢?
例如:
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();
}
一些API中有阻塞的替代异步函数,但在这种情况下没有。我感激任何帮助。谢谢!
loop.exec()
时进行随机未预料到的操作、退出应用程序等,导致exec()
返回后应用程序处于未预料到的不一致状态。这就是为什么我建议使用槽并在那里继续,即使这样更冗长。 - Frank Osterfeld