2012-07-30 319 views
2

如果我爲它創建一個進程和兩個管道集,並且該進程需要某個用戶輸入某個時間,則來自Windows C API的GetExitCodeProcess()始終返回1。正如你可以利用Windows time命令的例子,這將返回:當進程尚未完成時GetExitCodeProcess()返回1

The current time is: ... 
Enter the new time: 

然後立即退出,而無需等待輸入。

我不希望該過程完成,直到它真的完成了,所以我可以管輸入到它。我該如何解決這個問題。

我建立這個循環(我仍然希望能夠確定何時處理已完成):

for (;;) 
{ 
    /* Pipe input and output */ 
    if (GetExitCodeProcess(...) != STILL_ACTIVE) break; 
} 

在此先感謝。

+1

如果你想知道什麼時候該過程完成後,不使用GetExitCodeProcess - 考慮會發生什麼,如果進程退出代碼是STILL_ACTIVE!相反,使用WaitForSingleObject。一旦進程退出,進程句柄將發出信號。 – 2012-07-30 20:18:57

+0

是的,但WaitForSingleObject會鎖定當前線程。此外,Microsoft建議不要使用STILL_ACTIVE作爲退出代碼(259)。 – Jori 2012-07-31 08:46:28

+3

如果您期待窗口消息,請使用MsgWaitForMultipleObjects而不是WaitForSingleObject。但是,如果確實需要輪詢,則可以使用WaitForSingleObject超時爲零。這測試對象的狀態並立即返回。微軟可能會建議不要退出STILL_ACTIVE代碼,但如果有程序員採取任何預防措施的話,很少有人會這樣做。既然以正確的方式做到這一點很容易,爲什麼要冒這個風險呢? – 2012-07-31 19:46:29

回答

12

GetExitCodeProcess返回STILL_ACTIVE; STILL_ACTIVE是通過lpExitCode輸出參數返回的退出代碼。你需要測試返回的退出代碼:

DWORD exitCode = 0; 
if (GetExitCodeProcess(handle, &exitCode) == FALSE) 
{ 
    // Handle GetExitCodeProcess failure 
} 

if (exitCode != STILL_ACTIVE) 
{ 
    break; 
} 
+0

@HansPassant:同意!答覆修正。 (我已經瀏覽了聲明,並在返回文檔中只讀「返回非零」)。 – 2012-07-30 17:04:30

+0

當然。我愚蠢。這個bug在那裏已經很長時間了,但是當我嘗試將輸入輸入到程序時,我只注意到它。非常感謝。 – Jori 2012-07-31 08:49:04

+0

不適用於我,即使進程正在等待消息框並且返回值爲1,進程的退出代碼也爲0。 – 2013-03-22 16:20:40

相關問題