Killer un processus : bonne méthode?

Résolu
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 - 12 juin 2007 à 21:19
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 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
A voir également:

13 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juin 2007 à 11:36
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-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juin 2007 à 15:48
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-
3
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
13 juin 2007 à 15:28
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
1
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
13 juin 2007 à 12:17
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juin 2007 à 12:29
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-
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
13 juin 2007 à 12:37
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'.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juin 2007 à 12:45
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-
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
13 juin 2007 à 13:07
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!
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juin 2007 à 13:43
Pour enlever le freez, tu peux éven. faire tourner ta méthode dans un thread à part...

<hr />
-Blog-
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
13 juin 2007 à 13:58
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juin 2007 à 14:32
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-
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
13 juin 2007 à 14:45
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!
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juin 2007 à 15:25
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-
0
Rejoignez-nous