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