Мое приложение (загрузочное приложение для установщика, над которым я работаю, должно запустить некоторые другие приложения (мой установщик и сторонние установщики для предварительных требований моего установщика) и дождаться их завершения. Для того, чтобы графический интерфейс мог обновляя экран во время ожидания завершения приложения, я поместил насос сообщений в цикл ожидания, используя пример «MFC-совместимый» в документации Visual Studio по обработке цикла ожидания в качестве руководства. Мой код (который находится в функции-члене) класса, производного от CWinApp), выглядит следующим образом:
if (::CreateProcess(lpAppName, szCmdLineBuffer, NULL, NULL, TRUE, 0, NULL, NULL,
&StartupInfo, &ProcessInfo))
{
::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
if (bWait)
while (dwExitCode == STILL_ACTIVE)
{
// In order to allow updates of the GUI to happen while we're waiting for
// the application to finish, we must run a mini message pump here to
// allow messages to go through and get processed. This message pump
// performs much like MFC's main message pump found in CWinThread::Run().
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!PumpMessage())
{
// a termination message (e.g. WM_DESTROY)
// was processed, so we need to stop waiting
dwExitCode = ERROR_CANT_WAIT;
::PostQuitMessage(0);
break;
}
}
// let MFC do its idle processing
LONG nIdle = 0;
while (OnIdle(nIdle++))
;
if (dwExitCode == STILL_ACTIVE) // was a termination message processed?
{
// no; wait for .1 second to see if the application is finished
::WaitForSingleObject(ProcessInfo.hProcess, 100);
::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
}
}
::CloseHandle(ProcessInfo.hProcess);
::CloseHandle(ProcessInfo.hThread);
}
else
dwExitCode = ::GetLastError();
Проблема, с которой я столкнулся, заключается в том, что в какой-то момент этот насос сообщений, кажется, освобождает окно и дескрипторы меню в окне, которое я открывал во время выполнения этого кода. Я прошел через отладчик, и он ни разу не попал в тело оператора if (! PumpMessage ()), так что я не знаю, что здесь происходит, чтобы вызвать дескрипторы окна и меню. юг. Если у меня нет сообщения, все работает нормально, за исключением того, что графический интерфейс не может обновляться, пока работает цикл ожидания.
У кого-нибудь есть идеи, как заставить это работать? В качестве альтернативы я хотел бы запустить рабочий поток для запуска второго приложения, если bWait имеет значение ИСТИНА, но я никогда раньше ничего не делал с потоками, поэтому мне понадобится несколько советов о том, как это сделать без проблем с синхронизацией и т. Д . (Примеры кода были бы очень полезны в любом случае.)