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