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 :

[C#] - Problème sur fermeture d'un thread


Sujet :

Windows Forms

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut [C#] - Problème sur fermeture d'un thread
    Bonjour

    Voilà le code associé à ce problème :
    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
     
    private bool m_bIsThreadRefreshRunning = false;
    private bool m_bIsApplicationClosing = false;
     
    private void FormPrincipal_Load(object sender, System.EventArgs e)
    {
       ...
       ThreadPool.QueueUserWorkItem(new WaitCallback(RefreshModeThread), this);
    }
     
    static void RefreshModeThread(object state) 
    {
        // Récupération du context
        FormPrincipal fp = (FormPrincipal)state;
     
        // Cette thread démare
        fp.m_bIsThreadRefreshRunning = true;
     
        // Mise à jour de controles visuels
        while( !fp.m_bIsApplicationClosing )
        {
           // Somme-nous en mode de rafraîssement, si oui alors on met à jour ?
           if ( fp.m_bIsButtonRefreshMode )
               fp.UpdateDisplay();
        }
     
        // Cette thread sera arrêté après cette ligne
        fp.m_bIsThreadRefreshRunning = false;
    }
     
    private void FormPrincipal_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        // Forcer l'arrêt du thread de rafraichissement
        m_bIsApplicationClosing = true;
     
        // Looper et empêcher une fermeture tant que la thread ne 
        // sera pas arrêter (En mode refresh la thread du haut FREEZE dans la procédure UpdateDisplay()
        while (m_bIsThreadRefreshRunning)
            Thread.Sleep(10);
    }
     
    private void UpdateDisplay()
    {
        this.m_Txt_Analog_1.Text = "Hello world"; // Cette ligne FREEZE la thread, est-ce que ce serait un problème de CROSS-Thread ? Pourtant j'ai tenté un Invoque mais aucun succès, quelque à une idée ?
    }
     
    private void m_bt_ModeStop_CheckedChanged(object sender, System.EventArgs e)
    {
       m_RefreshMode = false;  // Stop refresh mode
    }
     
    private void m_bt_ModeRefresh_CheckedChanged(object sender, System.EventArgs e)
    {
       m_RefreshMode = true;  // Active refresh mode
    }
    Merci pour votre aide.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut Re: [C#] - Problème sur fermeture d'un thread
    Citation Envoyé par Erakis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void UpdateDisplay()
    {
        this.m_Txt_Analog_1.Text = "Hello world"; 
    }
    Cette ligne FREEZE la thread, est-ce que ce serait un problème de CROSS-Thread ? Pourtant j'ai tenté un Invoque mais aucun succès, quelque à une idée ?
    En effet il est impératif d'utiliser Invoke ou BeginInvoke pour accéder aux contrôles.
    Donnes donc le code Invoke que tu as essayé.

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Bonjour,

    J'ai essayé avec :

    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
     
    private delegate void ChangeTextDelegate(TextBox tb, string chaine);
     
    private void ChangeText(TextBox tb, string chaine)
    {
       if ( !tb.InvokeRequired )
       {
          tb.Text = chaine;
       }
       else
       {
         tb.Invoke(new ChangeTextDelegate(ChangeText), new object[] {tb, chaine} ); 
       }
    }
     
    private void UpdateDisplay() 
    { 
        ChangeText( this.m_Txt_Analog1.Text, "Hello world" );
    }
    Le thread FREEZE toujours et encore à la même ligne .

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Après essai, je constate qu'on ne peux pas appeler une méthode d'une Form à partir d'un autre thread.

    Une variante qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    if (fp.m_bIsButtonRefreshMode)
                        //fp.UpdateDisplay(); //cause une erreur
                        fp.Invoke(new ChangeTextDelegate(fp.ChangeText), new object[] { fp.m_Txt_Analog_1, "Hello world" });
                    }

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Bonjour,

    Merci NicolasG, j'ai ré-essayé avec ce code ce matin et tout fonctionne correctement.
    Décidemment, deux bonnes nuits de sommeil ça fait toujours du bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (fp.m_bIsButtonRefreshMode) 
    {
        fp.Invoke( new UpdateDisplayDelegate(fp.UpdateDisplay) );
        Thread.Sleep( 100 );
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2014, 15h36
  2. [D6][Win64] Problème sur fermeture de l'application
    Par Gazole22 dans le forum Débuter
    Réponses: 13
    Dernier message: 16/11/2012, 10h09
  3. [C#] Problème sur un Thread
    Par bisounux dans le forum Windows Forms
    Réponses: 7
    Dernier message: 27/04/2006, 20h43
  4. Réponses: 2
    Dernier message: 03/02/2006, 15h12
  5. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 01h03

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