2009-08-06 9 views
4

Je dois vérifier si un processus avec un HANDLE donné est toujours en cours d'exécution, j'ai essayé de le faire en utilisant le code suivant mais il retourne toujours à la deuxième valeur false, même si le processus est en cours .Détection si un processus est toujours en cours

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 
} 

Répondre

6

Vous pouvez tester la durée de vie de processus en utilisant

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

Juste besoin d'ajouter un chèque pour le INVALID_HANDLE_VALUE depuis signalé le processus était en cours d'exécution quand ce n'était pas encore valide :) –

+0

Les API telles que WaitForSingleObject ne devraient jamais retourner INVALID_HANDLE_VALUE si vous avez un handle de processus ouvert, même s'il est terminé. Le handle et l'objet sous-jacent doivent rester ouverts jusqu'à leur fermeture explicite par les processus de référencement (ou ces processus sont terminés). Etes-vous sûr que vous n'essayez pas de l'appeler sur l'ID de processus et pas un handle? –

+0

Je voulais dire une vérification avant le WaitForSingleObject, dans le cas où le processus n'avait pas encore été créé, donc le handle était toujours à la valeur que je l'initialisais, à savoir INVALID_HANDLE_VALUE, car passer INVALID_HANDLE_VALUE à WaitForSingleObject expire toujours (ie INVALID_HANDLE_VALUE est jamais dans un état signalé, il semble). –

0

Vous pouvez utiliser EnumProcesses() pour que tous les processus s'exécutent sous Windows. Quelque chose comme:

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 C'est toujours potentiellement utile, même si c'est compliqué. – KymikoLoco

+0

Très inefficace cependant, et puisqu'il utilise un ID de processus plutôt qu'un handle, soumis à une condition de concurrence inhérente. * Potentiellement * utile, je suppose, mais probablement seulement dans les cas marginaux. –

1

Je sais que c'est un peu en retard, mais votre code doit se lire comme si vous voulez que les résultats que vous attendez.

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; 
} 

Si vous avez seulement l'ID de processus (PID), cet extrait fonctionnera (sans vérification d'erreur):

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

Cette approche doit être évitée, car il est possible d'obtenir STILL_ACTIVE pour un processus qui s'est terminé. (C'est un code de sortie valide.) –

+0

@HarryJohnston Si et seulement si le processus utilise 259 comme code de sortie, est-ce correct? Microsoft conseille de ne pas utiliser cela comme un code d'erreur. Comme le processus que je vérifie n'a aucune chance de retourner 259 (comme je l'ai écrit), c'est une utilisation parfaitement acceptable du code de sortie. Cela ressemble à un épouvantail qui ne s'applique que lorsque vous vérifiez le code de sortie d'un processus que vous n'avez aucun pouvoir. (Il est bon de savoir et de savoir, cependant) – KymikoLoco

+0

Dans ce scénario particulier, cette approche * pourrait être acceptable. Le PO n'a pas dit si le processus qu'il vérifiait était son propre code, et votre réponse ne l'a pas non plus précisé. –

Questions connexes