2012-10-15 15 views
6

ここでWaitForSingleObjectを使用しない場合の利点は何ですか?コードの最初のブロックはprevious answerです。 2番目のブロックは、私がそれをやっているところです。プロセスIDを確認するときにWaitForSingleObjectを使用するメリット

BOOL IsProcessRunning(DWORD pid) 
{ 
    HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); 
    const bool exists = (process != NULL); 
    CloseHandle(process); 
    return exists; 
} 

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

SYNCHRONIZEを使用すると、高い権限を必要とし、私は現在のユーザーに対してのみPIDを確認したいように思えます。

+1

比較作業を追加するには、プロセスの完了ステータスを判断するために 'GetExitCodeProcess'と' WaitForSingleObject'を比較したいかもしれません。 –

答えて

8

プロセスが完了すると、プロセスは停止しますが、最後のハンドルが閉じられるまで存在しません。最初の解決策は、これらの2つの状態(まだ実行中または実行中)を区別します。もちろん、答えは返されるまでには時代遅れになる可能性があります。

このような区別が必要ない場合は、(DoesProcessExistのような名前を付けても)アプローチは問題ありません。

+1

私はプロセスID *を理論的に加えて再利用することもできます。一般にIDでプロセスを開くのは良い考えではありません。ハンドルを一度開く方が良い(または作成した場合は保存するか、サードパーティから取得する)。 – valdo

-1

WaitForSingleObjectは、プロセスが完了するか終了するまで待機します。それだけでそれは戻ってきます。

+3

0のタイムアウトではありません。 –

+0

@AdrianMcCarthyあなたは正しいです - 私は0を見ませんでした。 – user93353

+0

ゼロタイムアウトは驚異の一部です(うまくいけば私はそのことを綴りました)、それはすぐにタイムアウトします)または失敗(=ゾンビプロセス)。 – Damon

1

IsProcessRunningの実装では、GetExitCodeProcess Win32 APIも使用できます。

+0

プロセスが意図的に終了コードとして259( 'STILL_ACTIVE')を返した場合はどうなりますか? – zett42