IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Rechercher un processus en doublon et le tuer, ca marche presque


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Rechercher un processus en doublon et le tuer, ca marche presque
    Bonjour à tous,

    J'ai récupérà un code qui me permet de tuer un processus s'il est lancé, par ex la calculatrice.

    Voila la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    using System;
    using System.Diagnostics;
     
    namespace Empecher2eExe2
    {
        class Class1
        {
            public bool FindAndKillProcess(string nomDuProcess)
            {
                foreach (Process clsProcess in Process.GetProcesses())
                {
                    if (clsProcess.ProcessName.StartsWith(nomDuProcess))
                    {
                        clsProcess.Kill();
                        return true;
                    }
                }
                return false;
            }
        }
    }
    Et là je suis confronté a 2 problemes : je voudrais que cela tourne en boucle. J'ai donc mis dans un do - while qui tourne en boucle (pas très beau mais je ne vois pas comment faire autrement) mais du coup visual studio me refuse l'acces à clsProcess.Kill();

    De plus je ne vois pas comment faire pour dire que je refuse le lancement d'un DEUXIEME process. On lance la calculatrice une fois, c'est bon, mais toutes les autres fois ca doit tuer le nouveau process à chaque fois.

    Merci d'avance !

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 6
    Points
    6
    Par défaut Process
    Bonjour,

    En premier pour bien comprendre, vous avez une application extérieure qui doit surveiller un process.
    Dans ce contexte il faudrait récupérer le LifeTime(StartTime par exemple) des process et tuer le plus jeune. Ensuite au moment du kill il est bon d'attendre la fin du process.
    Le problème de la boucle est qu'elle bloque le système, une parade simple serait de rendre un peu de temps au système avec un Sleep(x).

    Cordialement.

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    La conception en elle même est tordue!
    Il existe un pattern tout à fait adapté et éprouvé pour cet situation: le pattern singleton. http://faqcsharp.developpez.com/?pag...gleinstanceapp

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Par contre, si j'ai bien compris, le pattern singleton n'autorise qu'une seule instance de lui-même, alors que je cherche a faire cela pour un exe lancé séparément.
    Ou alors je me trompe ?

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Effectivement. Mais controler une instance d'un autre programme n'ammènera qu'une solution bancale.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    @yougoudai: si tu essaies de faire en sorte que ton appli ne soit lancée qu'une seule fois, ce n'est pas la bonne solution. (Ou veux-tu vraiment surveiller le lancement d'un programe externe?)
    Tu trouveras peut être une piste ici (j'ai déjà utilisé la méthode avec le mutex)

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Effectivement je voudrais surveiller un programme externe

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Pour info, j'ai réussi à écrire ce bout de code, qui en fera hurler certains :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    do
    {
        Process[] theProcesses = Process.GetProcessesByName("calc");
        Process p = new Process();
     
        if (theProcesses.Length > 1)
        {
            foreach (Process Processus in theProcesses)
            {
                if (Process.GetProcessesByName("calc").Length > 0)
                {
                    Console.WriteLine("There is already another instance of the application running");
                    Processus.Kill();
                    Console.ReadLine();
                }
            }  
        }
    } while (true);
    Pourtant cela fonctionne presque ! Je lance ce code. Puis je lance la calculatrice. Puis j'en relance une deuxieme instance et là ca fonctionne : cela tue le 2e process. Mais ca ne detecte plus les instances suivantes !

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Aaaaaaahhhhhhhh!

    Je viens de tester quelque chose que j'ai trouvé ici et qui devrait te convenir... On utilise l'assembly System.Management avec les requêtes Wql (testé sous .NET 4)

    Ca donne ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Management;
     
    namespace ProcessWatcher
    {
    	public class Program
    	{
    		static void Main(string[] args)
    		{
     
    			ManagementEventWatcher startWatch = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
    			startWatch.EventArrived += new EventArrivedEventHandler(startWatch_EventArrived);
    			startWatch.Start();
    			ManagementEventWatcher stopWatch = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
    			stopWatch.EventArrived += new EventArrivedEventHandler(stopWatch_EventArrived);
    			stopWatch.Start();
    			Console.WriteLine("Press ENTER to exit");
    			Console.ReadLine();
    			startWatch.Stop();
    			stopWatch.Stop();
     
    		}
     
    		static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e)
    		{
    			Console.WriteLine("Process stopped: {0}", e.NewEvent.Properties["ProcessName"].Value);
    		}
     
    		static void startWatch_EventArrived(object sender, EventArrivedEventArgs e)
    		{
    			Console.WriteLine("Process started: {0}", e.NewEvent.Properties["ProcessName"].Value);
    		}
     
    	}
    }

  10. #10
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Merci Chrisdot !
    Cependant, à la compilation j'ai une erreur :

    The type or namespace name 'EventArrivedEventArgs' could not be found (are you missing a using directive or an assembly reference?)
    Pourtant j'ai bien mis le using System.Management..

    Pour info je suis en .NET 3.5

    EDIT : Autant pour moi, je n'avais pas lu tout le lien... Je viens d'ajouter la référence System.Management.

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Et la reference à la dll? (assembly reference)

  12. #12
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    C'est ce que je regardais, par contre je n'ai pas compris ce point.

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    salut,

    Pourtant cela fonctionne presque ! Je lance ce code. Puis je lance la calculatrice. Puis j'en relance une deuxieme instance et là ca fonctionne : cela tue le 2e process. Mais ca ne detecte plus les instances suivantes !
    question débile :
    t'as bien appuyé sur "entrée" après le kill du process : "Consol.readLine()" oblige :p

    pour référencer une DLL :
    1) va dans ton "Explorateur de solutions"
    2) déroule ton projet
    3) click droit sur "references"
    4) "Ajouter une référence..."
    5) Onglet ".NET" (par défaut)
    6) choisis ta DLL dans la liste
    7) "Ok" ( :p )

Discussions similaires

  1. [XL-2007] Recherche et dénombrement de doublons
    Par dodo69 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/04/2011, 11h15
  2. Recherche et effacement de doublons
    Par thebuzzman dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/11/2010, 07h18
  3. rechercher un processus
    Par thieu17 dans le forum Windows 2000/Me/98/95
    Réponses: 1
    Dernier message: 24/06/2009, 17h54
  4. Recherche d'emplacement de doublons
    Par solorac dans le forum Excel
    Réponses: 12
    Dernier message: 17/07/2007, 17h37
  5. Script permettant de trouver les processus root et de les tuer
    Par biglittlekiss dans le forum Administration système
    Réponses: 3
    Dernier message: 18/11/2006, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo