вопрос WaitForSingle для процесса

можно ли исходя из данного кода сделать вывод что процесс запущен?

    res = WaitForSingleObject(hProcess, 2000);
    switch(res)
    {
    case WAIT_TIMEOUT: 
        //процесс не работает
        CloseHandle(hProc); //закрываем 
        return 1;
    default:
        //процесса нет
        CloseHandle(hProc);         
        return 0;
        break;
...

Ответы (1 шт):

Автор решения: nick_n_a

Ответ на вопрос - нет нельзя, 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;
}

позволяет однозначно понять завершился процесс или нет

Можно так же опрашивать другие параметры процесса при работе, и так же можно взаимодействовать с консолью дочернего процесса если она есть.

→ Ссылка