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

Windows Forms Discussion :

Thread + Classe Trace - Réalisation d'une fenêtre de Debug


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Thread + Classe Trace - Réalisation d'une fenêtre de Debug
    Bonjour à tous,

    Je suis en train de développer un nouveau programme avec un autre développeur, et pour faciliter la maintenance, j'ai pour mission de réaliser une nouvelle fenêtre qui réaliserait la fonction de fenêtre Debug.

    Elle serait mis en arrière plan du programme et se mettrait à jour instantanément selon les éléments de la classe Trace que l'on a dissimulé dans le code du programme principale. Les élement de la classe Trace sont les méthodes Write, WriteIF, TraceError, TraceInformation, etc. dans le but de pouvoir retrouver plus facilement la partie du programme qui génèrent des erreurs.

    Ma fenêtre de débug serait composé d'une ListBox permettant de stocker les informations provenant des méthodes de la Classe Trace et d'un bouton pour Activer / Désactiver les listeners provenant de la classe Trace afin de pouvoir choisir quand on veut visualiser les informations.

    En gros le fonctionnement, lorsque j'active l'écoute des listeners j'enregistre dans la ListBox tous les éléments que je recois et quand je désactive le bouton j'arrête de regarder ce que provient des listeners.

    J'ai donc pensé à créer un Thread dans la fenêtre principale qui créerait une nouvelle instance de ma fenêtre Debug en lui transferant tous les éléments de Trace que je rencontre à l'aide de délégué.

    Mais comme je ne connais pas bien les thread, ca ne marche pas du tout ... :'(

    Donc comment faire pour créer une Form à partir d'un thread ?
    Est il possible de passer au thread des éléments à d'autres moments qu'a sa création ?
    L'utilisation d'un BackgroundWorker serait plus intéressant ?

    Toute idée pour faire fonctionner cette fenetre est la bienvenue !! ;D

    Le code que j'utilise actuellement pour mon thread est le suivant :

    Code Fenêtre Main
    Code cs : 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
     
    myThread = new Thread(new ThreadStart(DoWork));
    myThread.Start();
     
    public static void DoWork()
    {
         Debug.frmDebug frmDebug = new Debug.frmDebug();
         frmDebug.Show();
     
         while (myThread.IsAlive)
         {
             // Délégué de ma fenêtre Débug pour transmettre un élément de Trace
             frmDebug.AddTraceEvent(TraceEventType.Error, "Mon premier message d'erreur");
             Thread.Sleep(1000);
         }
    }

    Code fenêtre Debug
    Code cs : 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
     
    public partial class frmDebug : DevExpress.XtraEditors.XtraForm
        {
            public delegate void TraceEventDebug(TraceEventType typeEvent, string message);
            public event TraceEventDebug mesTracesEvents;
     
            public frmDebug()
            {
                InitializeComponent();
     
                Trace.Listeners.Clear();
                int index = Trace.Listeners.Add(new TextWriterTraceListener(new MemoryStream(),"Debug Perso"));
                Trace.AutoFlush = true;
     
                mesTracesEvents = new TraceEventDebug(this.AddTraceEvent);
            }
     
            public void AddTraceEvent(TraceEventType typeEvent, string messageEvent)
            {
                switch (typeEvent)
                {
                    case TraceEventType.Information :
                        Trace.TraceInformation(messageEvent);
                        break;
                    case TraceEventType.Error:
                        Trace.TraceError(messageEvent);
                        break;
                    case TraceEventType.Warning:
                        Trace.TraceWarning(messageEvent);
                        break;
                    default : 
                        Trace.WriteLine(messageEvent);
                        break;
                }
            }
    }

    De plus avec le thread et la méthode Show(), je ne voit pas les controls que j'ai définie dans cette fenetre.
    Comment faire pour les afficher ?

    Merci d'avance.

    A++

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    pourquoi tu veux créer cette fenêtre dans un autre thread ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Car la fenêtre de debug ne sera pas toujours présente dans le programme et de simplement la lancher comme une tache de fond, le but plus tard sera de faire appel via une commande ou raccourci de touche et de plus dans aucun cas l'ajout de cette fenêtre de débug ne doit nuire au performance du programme.

    Donc je pensais que l'utilisation d'un Thread ou BackgroundWorker en arrière plan serait une bonne idée.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Si tu commences à afficher une fenêtre dans un autre thread, tu t'exposes à pas mal de galères pour un bénéfice assez limité... Si tu veux vraiment faire ça, il faut
    1. lancer une nouvelle boucle de messages pour ta nouvelle fenêtre, avec Application.Run
    2. gérer les appels entre les 2 threads via la méthode Invoke de la nouvelle fenêtre, en passant des delegates en paramètre. En effet, on ne peut accéder à une interface graphique qu'à partir du thread qui l'a créée. La méthode Invoke permet d'exécuter du code sur le thread d'une autre fenêtre

    Mais de toutes façons, je ne pense pas que ce soit utile d'utiliser un thread séparé. Ta fenêtre ne nuira pas aux performances de l'application si elle ne fait rien de plus qu'afficher quelques lignes de debug.

    Sinon, juste un petit conseil sans lien direct avec ton problème : utilise une TextBox plutôt qu'une ListBox. Si c'est des infos de debug qui sont affichées dedans, tu auras sans doute besoin de les copier/coller, et c'est beaucoup plus simple avec une TextBox... Ou alors il faut que tu ajoutes un bouton "Copier" à la fenêtre

Discussions similaires

  1. [VB.NET] Comment ouvrir une fenêtre modale avec Thread ?
    Par Damien10 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/11/2006, 12h28
  2. [C#] Comment appeler une fenêtre modale dans un autre thread ?
    Par Pilloutou dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/10/2006, 12h19
  3. Réponses: 6
    Dernier message: 02/10/2006, 23h40
  4. afficher une fenêtre dans le thread
    Par LN(a) dans le forum Langage
    Réponses: 8
    Dernier message: 21/12/2005, 14h21

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