2017-05-24 133 views
2

如果我通過CreateProcess()創建了一個流程,我將如何確定它是否仍在運行?我知道我需要使用pi.hProcess,但我不知道如何,谷歌並沒有真正給我有意義的提示。如何判斷用CreateProcess啓動的進程是否仍在運行?

PROCESS_INFORMATION pi; 
STARTUPINFO si; 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 
bool got_it=CreateProcess(NULL, CA2T(launchString.c_str()), NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); 

回答

6

您可以使用任何標準wait functions,像WaitForSingleObject(),例如:

switch (WaitForSingleObject(pi.hProcess, 0)) 
{ 
    case WAIT_OBJECT_0: 
     // process has terminated... 
     break; 

    case WAIT_TIMEOUT: 
     // process is still running... 
     break; 
} 
0

您可以GetExitCodeProcess()檢索過程的退出代碼,這將給特殊STILL_ACTIVE值,如果進程仍在運行:

DWORD exit_code; 
GetExitCodeProcess(pi.hProcess, &exit_code); 
if (exit_code == STILL_ACTIVE) { 

} 
+3

如果進程返回'STILL_ACTIVE'(259)作爲其實際退出代碼會怎麼樣? – zett42

+0

@ zett42:這是一種可能性,並且文檔會警告:「***重要** GetExitCodeProcess函數只有在線程終止後纔會返回應用程序定義的有效錯誤代碼。因此,應用程序不應該使用'STILL_ACTIVE'(259)作爲錯誤代碼,如果一個線程返回'STILL_ACTIVE'(259)作爲錯誤代碼,那麼測試該值的應用程序可以將其解釋爲意味着線程仍在運行並繼續測試線程終止後線程的完成,這可能會導致應用程序陷入無限循環。*「 –

+0

@Remy所以這不是一個通用的解決方案,因爲它需要其他進程的協作。改用'WaitForSingleObject()'來代替0超時。 – zett42

相關問題