2017-05-24 47 views
2

CreateProcess()によって作成されたプロセスがある場合、それがまだ実行されているかどうかをどのように判断できますか?私はpi.hProcessを使用する必要があることを知っているが、私はどのようにわからないし、Googleは本当に意味のあるヒントを与えていない。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

あなたはWaitForSingleObject()のように、標準wait functionsのいずれかを使用することができます例:

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

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

あなたはプロセスがまだ実行されている場合は、特別なSTILL_ACTIVE値を与えるであろう、GetExitCodeProcess()でプロセスの終了コードを取得できます、

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

} 
+3

プロセスが実際の終了コードとして 'STILL_ACTIVE'(259)を返すとどうなりますか? – zett42

+0

@ zett42:それは可能性があり、ドキュメンテーションが警告するもの: "***重要** GetExitCodeProcess関数は、スレッドが終了した後にのみアプリケーションによって定義された有効なエラーコードを返します。したがって、アプリケーションはスレッドがエラーコードとして 'STILL_ACTIVE'(259)を返した場合、この値をテストするアプリケーションは、スレッドがまだ実行中であることを意味すると解釈して、スレッドが終了した後にスレッドが完了すると、アプリケーションが無限ループになる可能性があります。* " –

+0

@Remyこれは他のプロセスの協力が必要なので一般的な解決策ではありません。代わりに0タイムアウトで 'WaitForSingleObject()'を使うのが良いでしょう。 – zett42

関連する問題