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