C++, Как определить, работает ли Windows Process?

Это были 1,5 года теперь, когда я использую SVN для различных проектов. Установки я использовал до сих пор:

не имели никаких проблем ни с одной из этих установок, и я определенно рекомендую использовать SVN, поскольку это свободно и легко начать использовать. Также многие управление проектами / пакеты отслеживания ошибок интегрируются с SVN (как trac, например).

58
задан Eric Leschinski 1 August 2013 в 20:04
поделиться

6 ответов

Вы можете использовать GetExitCodeProcess . Он вернет STILL_ACTIVE ( 259 ), если процесс все еще выполняется (или если он завершился с этим кодом выхода :().

68
ответ дан 24 November 2019 в 18:45
поделиться

Другой способ мониторинга дочернего процесса - создать рабочий поток, который:

  1. вызовет CreateProcess ()
  2. вызовет WaitForSingleObject () // рабочий поток теперь будет ждать, пока дочерний процесс завершает выполнение. также можно получить код возврата (из функции main ()).
6
ответ дан 24 November 2019 в 18:45
поделиться

The process handle will be signaled if it exits.

So the following will work (error handling removed for brevity):

BOOL IsProcessRunning(DWORD pid)
{
    HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid);
    DWORD ret = WaitForSingleObject(process, 0);
    CloseHandle(process);
    return ret == WAIT_TIMEOUT;
}

Note that process ID's can be recycled - it's better to cache the handle that is returned from the CreateProcess call.

You can also use the threadpool API's (SetThreadpoolWait on Vista+, RegisterWaitForSingleObject on older platforms) to receive a callback when the process exits.

EDIT: I missed the "want to do something to the process" part of the original question. You can use this technique if it is ok to have potentially stale data for some small window or if you want to fail an operation without even attempting it. You will still have to handle the case where the action fails because the process has exited.

35
ответ дан 24 November 2019 в 18:45
поделиться

Вы никогда не сможете проверить и увидеть, запущен ли процесс, вы можете только проверить, чтобы увидеть если процесс был запущен в какой-то момент в недавнем прошлом. Процесс - это объект, который не контролируется вашим приложением и может выйти в любой момент времени. Невозможно гарантировать, что процесс не выйдет в промежутке между проверкой, запущен ли он, и соответствующим действием.

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

вы можете только проверить, был ли процесс запущенным в какой-то момент в недавнем прошлом. Процесс - это объект, который не контролируется вашим приложением и может выйти в любой момент времени. Невозможно гарантировать, что процесс не завершится в промежутке между проверкой, запущен ли он, и соответствующим действием.

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

вы можете только проверить, был ли процесс запущенным в какой-то момент в недавнем прошлом. Процесс - это объект, который не контролируется вашим приложением и может выйти в любой момент времени. Невозможно гарантировать, что процесс не выйдет в промежутке между проверкой, запущен ли он, и соответствующим действием.

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

Наилучший подход - просто выполнить требуемое действие и перехватить исключение, которое будет выдано, если процесс не запущен.

Наилучший подход - просто выполнить необходимое действие и перехватить исключение, которое было бы выдано, если бы процесс не выполнялся.

3
ответ дан 24 November 2019 в 18:45
поделиться

call EnumProcesses() and check if the PID is in the list.

http://msdn.microsoft.com/en-us/library/ms682629%28VS.85%29.aspx

1
ответ дан 24 November 2019 в 18:45
поделиться

JaredPar is right in that you can't know if the process is running. You can only know if the process was running at the moment you checked. It might have died in the mean time.

You also have to be aware the PIDs can be recycled pretty quickly. So just because there's a process out there with your PID, it doesn't mean that it's your process.

Have the processes share a GUID. (Process 1 could generate the GUID and pass it to Process 2 on the command line.) Process 2 should create a named mutex with that GUID. When Process 1 wants to check, it can do a WaitForSingleObject on the mutex with a 0 timeout. If Process 2 is gone, the return code will tell you that the mutex was abandoned, otherwise you'll get a timeout.

1
ответ дан 24 November 2019 в 18:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: