我知道,下面还有一些类似的问题,但是我找不到能帮助我的具体答案。所以这是我的问题:

我在启动时进行一些GUI初始化的应用程序上工作。我要做的一件事就是打电话

NetworkConfigurationManager::updateConfigurations ()

这是一个异步调用,完成后会发出updateCompleted()信号。问题是,我所有其他的gui初始化都必须等待updateConfigurations()完成。

所以我能做的是这样的:
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,该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中,有异步功能的阻塞替代方法,但在这种情况下没有。

感谢您的帮助。谢谢!

最佳答案

做到这一点的方法是使用嵌套的事件循环。您只需创建自己的QEventLoop,将要等待的任何信号连接到循环的quit()插槽,然后将exec()循环。这样,一旦信号被调用,它将触发QEventLoop的quit()插槽,因此退出循环的exec()

MyApp::MyApp(QWidget *parent) : ....
{
    doSomeInits();
    {
        QEventLoop loop;
        loop.connect(configManager, SIGNAL(updateCompleted()), SLOT(quit()));
        configManager->updateConfigurations();
        loop.exec();
    }
    doReaminingInitsThatHadToWaitForConfigMgr();
}

关于c++ - 阻塞等待异步Qt信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3556421/

10-11 22:44
查看更多