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 :

Suivre l'avancement de l'exécution de processus


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de shawn12
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Avril 2006
    Messages
    3 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2006
    Messages : 3 368
    Par défaut Suivre l'avancement de l'exécution de processus
    Bonjour, je débute en C# et je voudrais dans un logiciel lancer plusieurs instances d'un exécutable qui écrit l'avancement de son exécution sur sa sortie d'erreur.

    Voici ce que j'ai fait pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                Process processus = new Process();
                ProcessStartInfo processusStartInfo = new ProcessStartInfo();
                processusStartInfo.FileName = commande;
                processusStartInfo.Arguments = arguments;
                processusStartInfo.UseShellExecute = false;
                processusStartInfo.RedirectStandardOutput = false;
                processusStartInfo.RedirectStandardError = true;
                processusStartInfo.CreateNoWindow = true;
                processus.StartInfo = processusStartInfo;
                // On définit un évènement pour intercepter ce qui est écrit par le processus
                processus.ErrorDataReceived += new DataReceivedEventHandler(Program.frmPrincipal.updateDownloadStatus);
                processus.Start();
                processus.BeginErrorReadLine();
                processus.Close();
    J'aimerais pouvoir en lancer plusieurs et suivre leur état d'avancement simultanément.

    J'aimerais associer à chaque processus un objet (qui existe déjà dans mon appli) pour indiquer ce qu'est le processus.

    Pour stocker les processus que je lance, je peux les mettre dans une List mais comment associer un objet à chaque processus ?
    J'avais aussi pensé à faire un Dictionnary<Processus, Objet> ce qui me permettrait dans mon DataReceivedEventHandler de retrouver facilement l'objet correspondant au processus qui a déclenché l'évènement.

    Etant donné que je débute en C#, est-ce que quelqu'un peut m'indiquer quelle est la meilleure solution ?

  2. #2
    Membre éprouvé Avatar de danuz
    Homme Profil pro
    Expert .NET (WPF, Silverlight, Windows Phone) chez Soat
    Inscrit en
    Avril 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Expert .NET (WPF, Silverlight, Windows Phone) chez Soat

    Informations forums :
    Inscription : Avril 2003
    Messages : 102
    Par défaut
    Tu veux lancer plusieurs processus, et chaque processus dépend d'un objet.
    L'idéal est de créer une méthode qui prend en paramètre un objet qui et qui en fonction de cet objet créé le processus adéquate.


    Exemple :

    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
     
    public void RunProcess(object o) {
         Process p = new Process();
         ProcessStartInfo psi = new ProcessStartInfo();
         if(o is typeObjet1) {
              psi.FileName = commande pour objet 1;
              psi.Arguments = arguments pour objet 1;
         } else if (o is typeObjet2) (
              psi.FileName = commande pour objet 2;
              psi.Arguments = arguments pour objet 2;
         }
     
         psi.UseShellExecute = false;
         psi.RedirectStandardOutput = false;
         psi.RedirectStandardError = true;
         psi.CreateNoWindow = true;
         p.StartInfo = psi;
         // On définit un évènement pour intercepter ce qui est écrit par le processus
         p.ErrorDataReceived += 
    new DataReceivedEventHandler(Program.frmPrincipal.updateDownloadStatus);
         p.Start();
         p.BeginErrorReadLine();
         p.Close();
    }

    Ce qu'il faut comprendre, c'est que le fait d’exécuter un processus est commun à chaque appel de processus que tu feras, chaque instance, donc, c'est le mieux de créer une méthode qui permettra d'en exécuter.

    Ensuite, Si tes objets sont dans un tableau, tu fais une boucle sur ce tableau, et pour chaque item, tu appelles la méthode RunProcess créé précédemment en lui passant l'item en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach(var item in tableauObjet) {
         RunProcess(item);
    }

    Si tes objets ne sont pas dans un tableau, tu n'as d'autres choix que de faire les appels manuellement


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RunProcess(objet1);
    RunProcess(objet2);
    RunProcess(objet3);
    etc...
    En espérant que ça t'a éclairé,

    Bon courage.

  3. #3
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Si tu veux lier un objet à chaque process, moi je ferais une classe qui hérite de Process
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class ProcessAndObj : Process
      {
        public object AnObject { get; set; }
     
        public ProcessAndObj(object anObject)
        {
          AnObject = anObject;
        }
     
        public void Run()
        {
          //fonction que tu as écrite pour lancer le process
        }
      }
    Tu implémente la fonction Run comme ce que tu as fait plus haut.

    La gestion des événement comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
          if (sender is ProcessAndObj)
          {
            (sender as ProcessAndObj).AnObject Tralalaitou........
          }
        }
    Et pour la création de tes process, un truc comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     List<ProcessAndObj> listObj = new List<ProcessAndObj>();
          ProcessAndObj p;
     
          for (int i = 0; i < 10; i++)
          {
            p = new ProcessAndObj(monObject);
            p.Run();
            listObj.Add(p);
          }

Discussions similaires

  1. Runtime.getRuntime().exec exécute le processus après la fin du programme Java
    Par scalande dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 14/02/2012, 17h56
  2. Réponses: 2
    Dernier message: 14/06/2010, 10h21
  3. Exécuter un processus avec wxWidget
    Par vronik dans le forum wxWidgets
    Réponses: 1
    Dernier message: 14/02/2009, 16h42
  4. Exécuter des processus à distance sur des postes Windows
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 23/12/2007, 13h13
  5. [JProgressBar] Suivre l'avancement d'une copie
    Par Sylver--- dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 04/07/2007, 11h56

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