Я знаю, есть некоторые похожие вопросы к следующему, но я не мог найти конкретного ответа, который мне помогает. Итак, вот моя проблема:
Я работаю над приложением, которое запускает некоторые инициализации 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();
}
Разделение инициализации не кажется мне хорошим способом. Я думаю, что это делает код намного сложнее читать - inits должны оставаться вместе. Другое дело: поскольку 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 существует блокировка альтернатив асинхронным функциям, но не в этом случае.
Я ценю любую помощь. Спасибо!