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

Signaler
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
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

13 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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'.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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!
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Pour enlever le freez, tu peux éven. faire tourner ta méthode dans un thread à part...

<hr />
-Blog-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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!
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

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