вопрос WaitForSingle для процесса
можно ли исходя из данного кода сделать вывод что процесс запущен?
res = WaitForSingleObject(hProcess, 2000);
switch(res)
{
case WAIT_TIMEOUT:
//процесс не работает
CloseHandle(hProc); //закрываем
return 1;
default:
//процесса нет
CloseHandle(hProc);
return 0;
break;
...
Ответы (1 шт):
Ответ на вопрос - нет нельзя, WAIT_TIMEOUT означет что процесс работает. Данная функция WaitForSingleObject используется для синхронизации с другим процессом (в данном случае), её нужно использовать, потому что при "прямом" опросе процесса у вас ЦП улетит в 100% и процессор будет греться. Пример - можно конвертировать видео внешней утилитой и ждать её завершения. Можно выполнять какие-то действия командной строки. Можно запускать какую-либо внешнюю программу. Любую программу.
Есть стандартный пример https://learn.microsoft.com/ru-ru/windows/win32/procthread/creating-processes
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
В большинстве случаев этого достаточно. CloseHandle - не закрывает процесс, а закрывает связь через которую можно взаимодействовать с процессом.
WaitForSingleObject - для процесса, она будет ожидать завершения работы процесса. Но... если не стоит INFINITE то после ожидания процесс может ещё работать.
WaitForSingleObject(hProcess, 2000);
Если вернулся WAIT_TIMEOUT, то процесс ещё работает (ну если после получения ответа мы недолго ждем), если нет - то процесс завершил работу либо невалидная hProcess.
Дальше можно строить по разному программу. Если нужно что бы процесс через 2 секунды был прерван то пишем
res = WaitForSingleObject(hProcess, 2000);
if (res == WAIT_TIMEOUT){
if (!TerminateProcess(hProcess , 0)) err = GetLastError();
}
На прерывание чужих процессов нужны дополнительно разрешения, на дочерние доп-разрешение не нужно как правило.
Но... можно например раз в секунду сделать некоторые действия и продолжить ожидание. Например
int seconds = 0;
while (running) {
res = WaitForSingleObject(hProcess, 1000);
if (res == WAIT_TIMEOUT) {
// процесс ещё работает, отработал 1 секунду
seconds++;
continue;
}
// Процесс уже не работает
break;
}
Полезная функция GetExitCodeProcess
function isWorking(HANDLE hProcess) {
DWORD code;
if (GetExitCodeProcess(hProcess,&code)) {
// если code - валидная
// если code = STILL_ACTIVE = 259 - то процесс ещё незавершон
if (code == 259) return true;
}
return false;
}
позволяет однозначно понять завершился процесс или нет
Можно так же опрашивать другие параметры процесса при работе, и так же можно взаимодействовать с консолью дочернего процесса если она есть.