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 :

Closer un thread de message d'attente proprement


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut Closer un thread de message d'attente proprement
    Bonjour,

    Je me heurte à un problème de threading et je souhaiterais vous exposer ma problématique.

    Lors d'un traitement lourd, je tente d'afficher dans un thread parallèle, une fenêtre d'attente dynamique. Voici ma 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
    using System.Drawing;
     
    namespace Test.Tools
    {
        public class WaitDialogThread
        {
            Thread waitDialogThread;
            string textToDiplay;
            Point location;
     
            public WaitDialogThread(string text, Point loc)
            {
                textToDiplay = text;
                location = loc;
            }
     
            public void Start()
            {
                waitDialogThread = new Thread(new ThreadStart(DisplayWaitDialog));
                waitDialogThread.SetApartmentState(ApartmentState.STA);
                waitDialogThread.Priority = ThreadPriority.Highest;
                waitDialogThread.Start();
            }
     
            public void Stop(Form formToRefresh)
            {
                if (waitDialogThread != null)
                {
                    waitDialogThread.Abort();
     
                    if (waitDialogThread.IsAlive)
                        waitDialogThread.Join();
     
                    if (formToRefresh != null)
                    {
                        formToRefresh.Focus();
                        formToRefresh.Activate();
                        formToRefresh.Refresh();
                        formToRefresh.BringToFront();
                    }
                }
            }
     
            /// <summary>
            /// Display a wait dialog in a new thread for Excel export.
            /// </summary>
            public void DisplayWaitDialog()
            {
                Point locationToDisplay = new Point(location.X + 407, location.Y + 329);
     
                WaitDialog wd = new WaitDialog(textToDiplay, locationToDisplay);
                Application.EnableVisualStyles();
                Application.Run(wd);
            }
        }
    }
    Ma fenêtre s'affiche parfaitement et cela marche relativement bien.

    Lorsque j'ai finis mon traitement, je fais un Abort() sur mon Thread, c'est très sale et dans certains cas précis, ca plante car mon application reste bloquée son mon Join() => Je fais le Join afin d'attendre que le Thread soit fermé.

    Ce que je voudrais : Communiquer avec mon thread afin de lui dire de closer sa fenêtre proprement.

    Avez-vous une idée?

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,
    connais tu le BackGroundWorker ? En gros, tu lui donnes une méthode, qu'il exécute dans un thread séparé ; quand il a fini, il lève un événement dans le thread de ta form, et ferme son thread de travail. Ça évite de se farcir la gestion de thread à la mano, très pratique
    ಠ_ಠ

  3. #3
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Merci pour cette orientation. Ce composant m'a l'air pas mal, il faudra juste que je fasse certaines modifications car je voyais les choses inversements : je faisais mes traitements dans mon thread principal et ma frame d'attente dans mon thread séparé alors que là, c'est l'inverse...

    N'est-ce pas compliqué à débugger après? Le thread exécuté par le BackGroundWorker?

    Je recommande cette documentation très bien faite sur le BackGroundWorker :
    http://glarde.developpez.com/dotnet/bgworker/cs/

  4. #4
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    J'ai une question tout de même, mes traitement lourds mettent à jour mes frames, est ce que le BackGroundWorker gère l'accès aux Forms de mon Thread principal?

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Vonziz Voir le message
    J'ai une question tout de même, mes traitement lourds mettent à jour mes frames, est ce que le BackGroundWorker gère l'accès aux Forms de mon Thread principal?
    Il n'est pas possible (en fait si mais ça amène des tas d'embrouilles) de modifier l'UI dans un autre thread que le sien.

    C'est (entre autres) pour ça qu'un développement en couches est préconisé, afin de séparer le métier de sa représentation. D'un côté, des méthodes sans rien de graphique, lourdes, avec des calculs, des appels à une source de données (via éventuellement des sous-méthodes des couches encore inférieures), etc. ; de l'autre, une couche avec des méthodes chargées simplement de la représentation des données métier.
    A ce moment là, seul le code métier est à exécuter dans un autre thread ; la partie graphique, rarement coûteuse, est laissée dans le thread de l'UI.
    ಠ_ಠ

  6. #6
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Ok je te remercie pour ton explication détaillée.

    Mon application n'ayant pas été conçue à la base sur cette logique de multi-thread pour l'exécution du métier, je n'ai pas le temps d'effectuer une refonte des appels aux diverses fonctions métier.

    Une question complémentaire : Le débuggage Visual Studio n'est-il pas galère dans un contexte multi-thread asynchrone?

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Vonziz Voir le message
    Mon application n'ayant pas été conçue à la base sur cette logique de multi-thread pour l'exécution du métier, je n'ai pas le temps d'effectuer une refonte des appels aux diverses fonctions métier.
    Ce que tu peux faire, par contre, si tu veux modifier les contrôles alors que ton thread courant n'est pas celui de l'UI, c'est d'utiliser le pattern if (this.InvokeRequired) this.Invoke (...) else { ... }, que je ne détaille pas ici parce qu'il revient souvent sur le forum (je l'ai vu y'a moins de trois jours ; une petite recherche de ces mots-clé t'y mènera vite)
    Citation Envoyé par Vonziz Voir le message
    Une question complémentaire : Le débuggage Visual Studio n'est-il pas galère dans un contexte multi-thread asynchrone?
    Dans VS, il y a une fenêtre "threads", qui permet de basculer entre les différents threads actifs. C'est certes plus complexe que du mono thread mais dans les cas simple c'est pas insurmontable.
    ಠ_ಠ

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. effacer un message d'attente
    Par ProgElecT dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 05/03/2006, 10h18
  2. Réponses: 8
    Dernier message: 25/11/2005, 18h38
  3. Message d'attente pendant pilotage Ole Excel
    Par yottatiger dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/09/2005, 09h14
  4. [IdTCP] Comment tester l'existence de messages en attente ?
    Par HopeLeaves dans le forum Web & réseau
    Réponses: 1
    Dernier message: 29/06/2005, 10h03
  5. Thread et message
    Par sioux dans le forum Langage
    Réponses: 28
    Dernier message: 01/06/2005, 00h33

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