Здравствуйте, C0x, Вы писали:
C0x>Есть Лаунчер. Он стартует некое приложение и скрывается из виду. Нужно как только дочерний процесс завершиться показать лаунчер снова.
... C0x>Как можно это сделать более правильно?
Я бы сделал WaitForSingleObject( pi.hProcess, INFINITE );
А если хочется еще и ловить закрытие лаунчера, то создать евент и засунуть оба хендла в WaitForMultipleObjects, но потребуется второй поток, чтобы обрабатывать события от GUI лаунчера.
А можно не создавать евент, а выходить из WaitForSingleObject по таймауту и смотреть, не изменилось ли что-то в состоянии лаунчера.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, C0x, Вы писали:
C0x>Есть Лаунчер. Он стартует некое приложение и скрывается из виду. Нужно как только дочерний процесс завершиться показать лаунчер снова.
SVZ>А если хочется еще и ловить закрытие лаунчера, то создать евент и засунуть оба хендла в WaitForMultipleObjects, но потребуется второй поток, чтобы обрабатывать события от GUI лаунчера.
Для ожидания оконных событий и объектов ядра в одном потоке есть MsgWaitForMultipleObjects. Так что второго потока не нужно.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, C0x, Вы писали:
C0x>>Есть Лаунчер. Он стартует некое приложение и скрывается из виду. Нужно как только дочерний процесс завершиться показать лаунчер снова. SVZ>... C0x>>Как можно это сделать более правильно?
SVZ>Я бы сделал WaitForSingleObject( pi.hProcess, INFINITE );
К сожалению вот эта строчка по неизведанным мне пока причинам блокирует отрисовку OpenGL графики в child процессе. То есть тупа открывается черное окно и висит и оба процесса чего-то ждут.
Сделал вот так и теперь все ок:
BOOL ret = CreateProcess(NULL, buff,
NULL,
NULL,
TRUE,
CREATE_NO_WINDOW,
NULL,
NULL,
&si,
&pi);
if (!ret)
{
break;
}
DWORD exitCode;
ret = GetExitCodeProcess(pi.hProcess, &exitCode);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
if (!ret)
{
break;
}
CHAR chBuf[0x4000];
memset(chBuf, '\0', sizeof(chBuf));
DWORD dwRead = 0;
BOOL bSuccess = FALSE;
CloseHandle(g_hChildStd_OUT_Wr);
g_hChildStd_OUT_Wr = NULL;
for (;;)
{
bSuccess = ReadFile(g_hChildStd_OUT_Rd, chBuf, 0x4000, &dwRead, NULL);
//if( ! bSuccess || dwRead == 0 ) break;
if (bSuccess && dwRead > 0)
{
out += UTF8ToW(chBuf);
}
else
{
break;
}
}
ok = true;
} while (0);
if (g_hChildStd_OUT_Rd != NULL)
CloseHandle(g_hChildStd_OUT_Rd);
if (g_hChildStd_OUT_Wr != NULL)
CloseHandle(g_hChildStd_OUT_Wr);
Здравствуйте, ononim, Вы писали:
SVZ>>А если хочется еще и ловить закрытие лаунчера, то создать евент и засунуть оба хендла в WaitForMultipleObjects, но потребуется второй поток, чтобы обрабатывать события от GUI лаунчера. O>Для ожидания оконных событий и объектов ядра в одном потоке есть MsgWaitForMultipleObjects. Так что второго потока не нужно.
У меня основной поток это Sciter. Вся остальное работа идет в рабочих потоках по паттерну Command.