Killer un processus : bonne méthode? [Résolu]

clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 12 juin 2007 à 21:19 - Dernière réponse : cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention
- 13 juin 2007 à 15:48
Bonjour, pour tuer un processus j'utilise cette méthode :

  private void KillProcess(string processName) {
   // liste des processus ayant ce nom
   Process[] process = Process.GetProcessesByName(processName);
   // pour chaques processus trouvés :
   for (int i = 0; i < process.Length; i++) {
                // on arrête le processus
                Process.GetProcessById(process[i].Id).Kill();
   }
  }

Pour appeler la méthode ou je veux dans le code :

KillProcess(NomDuProcess);

Voilà j'aimerais savoir si ma méthode est la bonne et savoir comment faire pour attendre que le processus soit bien terminé avant de poursuivre mon code? J'ai regardé du côté de Application.DoEvents(), d'une boucle while et de WaitForExit, mais ca na rien donné! Avez-vous la solution? Merci
Afficher la suite 

13 réponses

Répondre au sujet
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 13 juin 2007 à 11:36
+3
Utile
Salut,
Pourquoi appeler la property Id?

private
static
void KillProcess(
string processName)
{
  
// Liste des processus ayant ce nom
   Process[] processes =
Process.GetProcessesByName(processName);

  
foreach (
Process process
in processes)
   {
      process.Kill();
    
// process.WaitForExit();
   }
}

<hr />
-Blog-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 13 juin 2007 à 15:48
+3
Utile
Euh, si c'est deux processes différent, ils ont un nom différent => il faut appeler deux fois la méthode (une fois pour chaque nom)

<hr />
-Blog-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 13 juin 2007 à 12:17
0
Utile
Une erreur aparraît à la compilation "Une méthode doit posséder un type de retour", une idée? pourquoi avoir mis private static void? Merci
Commenter la réponse de clubberzZ
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 13 juin 2007 à 12:29
0
Utile
j'ai mis static car je l'ai testée et appelée dupuis le main.
Tu peux sans autre enlever le mot clef static si tu en a besoin dans une class...

<hr />
-Blog-
Commenter la réponse de cs_Bidou
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 13 juin 2007 à 12:37
0
Utile
J'ai quatre erreur à la compilation avec votre code, d'ou cela peut-il venir?

- Erreur 1 Le nom 'processes' n'existe pas dans le contexte actuel.
- Erreur 2 Une variable locale nommée 'process' ne peut pas être déclarée dans cette portée, car elle modifierait la signification de 'process', déjà utilisée dans une portée 'parent ou en cours' pour désigner autre chose.
- Erreur 3 'System.Array' ne contient pas de définition pour 'Kill'.
- Erreur 4 'System.Array' ne contient pas de définition pour 'WaitForExit'.
Commenter la réponse de clubberzZ
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 13 juin 2007 à 12:45
0
Utile
C'est parce que tu pas repris le code que je t'ai donné.
Fait un copier-coller de la méthode ci-dessus, tu verras que ça fonctionne sans problème (faut éventuellement refaire un peu de mise en page, rajouté des espaces, etc).

<hr />
-Blog-
Commenter la réponse de cs_Bidou
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 13 juin 2007 à 13:07
0
Utile
Excusez-moi, effectivement tout marche sans problème, cette fois-ci mon appli attend bien que le processus est finit avant de continuer, même si on dirait que l'appli gêle légèrement. Un grand merci à Bidou!
Commenter la réponse de clubberzZ
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 13 juin 2007 à 13:43
0
Utile
Pour enlever le freez, tu peux éven. faire tourner ta méthode dans un thread à part...

<hr />
-Blog-
Commenter la réponse de cs_Bidou
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 13 juin 2007 à 13:58
0
Utile
Pourrait-tu m'expliquer comment faire? Je suis un petit débutant en C# et je n'ai encore pas abordé les threads... Merci beaucoup
Commenter la réponse de clubberzZ
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 13 juin 2007 à 14:32
0
Utile
C'est un sujet assez compliqué tout ce qui touche à System.Threading.
Dans ton cas, c'est assez simple:

private
static
void KillProcess(
object processName)
{
  
// Liste des processus ayant ce nom
   Process[] processes =
Process.GetProcessesByName(processName.ToString());
  
foreach (
Process process
in processes)
   {
      process.Kill();
     
// process.WaitForExit();
   }
}

Que tu appelles comme ceci:

System.Threading.
Thread thread =
new System.Threading.
Thread(
new System.Threading.
ParameterizedThreadStart(KillProcess));
thread.Start(
"calc"); // <---- le nom du process

<hr />
-Blog-
Commenter la réponse de cs_Bidou
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 13 juin 2007 à 14:45
0
Utile
J'ai une dernière question à ce sujet, est ce que je peux killer deux process à la suite?

System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(KillProcess));
thread.Start("calc"); // <---- le nom du process
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(KillProcess));
thread.Start("notepad"); // <---- le nom du process

Merci pour toutes ces réponses!
Commenter la réponse de clubberzZ
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 13 juin 2007 à 15:25
0
Utile
C'est là que les thread deviennent justement un peu complexe...
Si tu lances plusieurs threads, tu peux pas savoir dans quel ordre il s'execute. Malgré que tu lances 'calc' en premier, c'est peut-être 'notepad' qui va d'abord être killé. Ou je vois des éventuels problèmes, c'est s'ils essayent d'accéder au même process au même moment.

Je ne peux pas t'en dire plus, il faut faire des testes et checker dans la doc si les fonctions utilisées sont thread-safe.

<hr />
-Blog-
Commenter la réponse de cs_Bidou
clubberzZ 89 Messages postés vendredi 29 octobre 2004Date d'inscription 3 décembre 2007 Dernière intervention - 13 juin 2007 à 15:28
0
Utile
Après avoir testé j'ai remarqué une chose, je m'éxplique, supposont que l'application que je veux killer puisse lancer un autre exe ici calc2.exe, comment faire pour que quand je tue calc.exe ca me tue calc2.exe aussi?

En tant normal quand j'appuies sur "Quitter" en fermant normalement le programme l'exe principal ferme le 2eme, mais la quand je kill le principal le 2eme reste ouvert et m'empeche de continuer le code de mon appli... Une idée? Merci
Commenter la réponse de clubberzZ

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.