2009-08-06 17 views
4

Ich muss überprüfen, ob ein Prozess mit einem bestimmten HANDLE noch läuft, ich habe versucht, es mit dem folgenden Code zu tun, aber es immer bei der zweiten Rückgabe false zurückgibt, auch wenn der Prozess ausgeführt wird .Erkennen, ob ein Prozess noch läuft

bool isProcessRunning(HANDLE process) 
{ 
    if(process == INVALID_HANDLE_VALUE)return false; 

    DWORD exitCode; 
    if(GetExitCodeProcess(process, &exitCode) != 0) 
     return false;//always returns here 

    return GetLastError() == STILL_ACTIVE;//still running 
} 

Antwort

6

können Sie testen den Prozess Lebensdauer von

bool isProcessRunning(HANDLE process) 
{ 
    return WaitForSingleObject(process, 0) == WAIT_TIMEOUT; 
} 
+0

einfach einen Scheck für die INVALID_HANDLE_VALUE hinzuzufügen benötigt, da, dass der Prozess berichtet wurde, läuft wenn es nicht einmal gültig war :) –

+0

APIs wie WaitForSingleObject sollten niemals INVALID_HANDLE_VALUE zurückgeben, wenn ein Prozess-Handle offen ist, selbst wenn es beendet wird. Das Handle und das zugrunde liegende Objekt müssen offen bleiben, bis sie von den referenzierenden Prozessen explizit geschlossen werden (oder diese Prozesse werden beendet). Sind Sie sicher, dass Sie nicht versuchen, die Prozess-ID und nicht ein Handle aufzurufen? –

+0

Ich meinte eine Überprüfung vor dem WaitForSingleObject, falls der Prozess noch nicht erstellt wurde, so dass das Handle immer noch auf dem Wert war, auf den ich es initialisiert habe, zB INVALID_HANDLE_VALUE, da INVALID_HANDLE_VALUE immer an WaitForSingleObject abläuft (dh INVALID_HANDLE_VALUEist nie drin) ein signalisierter Zustand scheint es). –

0

Sie können EnumProcesses() verwenden, um alle Prozesse unter Windows auszuführen. Etwas wie:

bool IsProcessRunning(int pid) 
{ 
unsigned long processes[2048]; 
unsigned long num_proc = 0; 
unsigned long needed = 0; 

    // assume that 2048 processes are enought 
    if (EnumProcesses(processes, sizeof(processes), &needed)) 
    num_proc = needed/sizeof(DWORD); 

    for (int i = 0; i < num_proc; i++) 
    if (processes[i] == pid) 
     return true; 

    return false; 
} 
+0

@gimpf Es ist immer noch nützlich, egal wie kompliziert es ist. – KymikoLoco

+0

Sehr ineffizient, und da es eine Prozess-ID anstelle eines Handles verwendet, unterliegt es einer inhärenten Race-Bedingung. * Möglicherweise * nützlich, denke ich, aber wahrscheinlich nur in Randfällen. –

1

Ich weiß, das ein bisschen spät, aber Ihr Code sollte wie folgt lesen, wenn Sie die Ergebnisse wollen Sie erwarten.

bool isProcessRunning(HANDLE process) 
{  
    DWORD exitCodeOut; 

    // GetExitCodeProcess returns zero on failure 
    if(GetExitCodeProcess(process, &exitCodeOut) == 0) 
    { 
     // Optionally get the error 
     // DWORD error = GetLastError(); 
     return false; 
    } 
    // Return if the process is still active 
    return exitCodeOut == STILL_ACTIVE; 
} 

Wenn Sie nur die Prozess-ID (PID) haben, wird dieser Schnipsel arbeiten (ohne Fehlerprüfung):

bool isProcessRunning(DWORD processID) 
{  
    if(HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processID)) 
    { 
     DWORD exitCodeOut; 
     // GetExitCodeProcess returns zero on failure 
     if(GetExitCodeProcess(process, &exitCodeOut) != 0) 
     { 
      // Return if the process is still active 
      return exitCodeOut == STILL_ACTIVE; 
     } 
    } 
    return false; 
} 
+0

Dieser Ansatz sollte vermieden werden, da es möglich ist, STILL_ACTIVE für einen Prozess zu erhalten, der beendet wurde. (Es ist ein gültiger Exit-Code.) –

+0

@HarryJohnston Wenn und nur wenn der Prozess 259 als Exit-Code verwendet, richtig? Microsoft empfiehlt, dies nicht als Fehlercode zu verwenden. Da der Prozess, den ich überprüfe, keine Chance hat, 259 zurückzugeben (wie ich es geschrieben habe), ist es eine vollkommen akzeptable Verwendung des Beendigungscodes. Das scheint ein boyyman zu sein, der nur gilt, wenn Sie den Exit-Code eines Prozesses überprüfen, für den Sie keine Macht haben. (Es ist jedoch gut zu wissen und sich dessen bewusst zu sein) – KymikoLoco

+0

In diesem speziellen Szenario könnte dieser Ansatz * akzeptabel sein. Das OP hat nicht gesagt, ob der Prozess, den sie überprüften, ihr eigener Code war oder nicht, und Ihre Antwort hat dies auch nicht als Voraussetzung genannt. –

Verwandte Themen