Thread pour l'affichage d'un Panel !

Signaler
Messages postés
46
Date d'inscription
mercredi 25 juillet 2012
Statut
Membre
Dernière intervention
12 septembre 2013
-
Messages postés
46
Date d'inscription
mercredi 25 juillet 2012
Statut
Membre
Dernière intervention
12 septembre 2013
-
Bonjour !

J'aimerai un petit coup de main... cela fait déjà un moment que je cherche sans vraiment trouver de solution...

Je vous explique ma situation :

Sur mon programme ( Pocket PC ) lorsque je valide un numéro d'équipe ( On tape un numéro d'équipe puis on valide ) un panel avec écrit "OK" vient s'afficher.

J'aimerai qu'après 5sec le panel disparaisse tout seul tout en gardant le Control sur le programme. Pour cela j'ai utilisé un Thread. Mon seul problème s'est qu’apparemment on ne peux pas gérer le panel directement dans le thread... Quelqu'un pourrai m'aider ?

Voici ma première tentative : ( ne fonctionne pas )

 #region Thread_2

        ThreadPLP ObjectPanel = new ThreadPLP();
        Thread ThreadPanel;

        public class ThreadPLP
        {
            public void DoWorkPanel()
            {
                Thread.Sleep(5000);
                pll1.Enabled = false;
            }
        }
       
        private void pll1_EnabledChanged(object sender, EventArgs e)
        {
            pll1.Visible = pll1.Enabled;
            if (pll1.Visible)
            {
                ThreadPanel = new Thread(ObjectPanel.DoWorkPanel);
                ThreadPanel.Start();
            }
        }
        
        private void pll1_LostFocus(object sender, EventArgs e)
        {
            pll1.Enabled = false;
        }

        private void pll1_Click(object sender, EventArgs e)
        {
            pll1.Enabled = false;
        }

        #endregion


J'ai aussi essayé avec un evenement :

 #region Thread_2

        ThreadPLP ObjectPanel = new ThreadPLP();
        Thread ThreadPanel;
        public static event Stop += new  EventHandler(StopThread);

        public class ThreadPLP
        {
            public void DoWorkPanel()
            {
                Thread.Sleep(5000);
               
                //J'ai essayer ça :
                Stop();

               //Puis ça :
               Stop.Invoke();
            }
        }
        

        private void StopThread()
        {
            pll1.Enabled = false;
        }
        
       
        private void pll1_EnabledChanged(object sender, EventArgs e)
        {
            pll1.Visible = pll1.Enabled;
            if (pll1.Visible)
            {
                ThreadPanel = new Thread(ObjectPanel.DoWorkPanel);
                ThreadPanel.Start();
            }
        }
        
        private void pll1_LostFocus(object sender, EventArgs e)
        {
            pll1.Enabled = false;
        }

        private void pll1_Click(object sender, EventArgs e)
        {
            pll1.Enabled = false;
        }

        #endregion


Donc voila je n'ai jamais utiliser de Thread... je débute un peu ! Donc si quelqu'un pourrai me débloquer sa serai génial ! Merci d'avance.

11 réponses

Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
146
Bonjour,

Pourquoi ne pas utiliser le contrôle Timer ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Messages postés
46
Date d'inscription
mercredi 25 juillet 2012
Statut
Membre
Dernière intervention
12 septembre 2013
1
Pour justement avoir la possibilité plus tard d'exploiter les élements windows form dans les threads.
Messages postés
46
Date d'inscription
mercredi 25 juillet 2012
Statut
Membre
Dernière intervention
12 septembre 2013
1
Je prends exemple sur une barre de chargement... mettre en place une procédure de chargement dans un thread avec l'affichage d'une 'progressbar' qui évolue en même temps que le chargement tout en gardant le contrôle sur le programme.
Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
146
Messages postés
46
Date d'inscription
mercredi 25 juillet 2012
Statut
Membre
Dernière intervention
12 septembre 2013
1
Merci beaucoup, mais le backgroundworker n'existe pas sur le développement mobile ! Comment faire ?
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
1
Salut,
Au passage, tu as même la page en français (pour les flemmards dans mon genre ^^) :
http://msdn.microsoft.com/fr-fr/library/ms171728.aspx

Le plus simple à mon gout, c'est un coup d'Invoke !
Quoi qu'il se passe, tu utilise la méthode Invoke pour appeler une méthode qui sera exécutée par ton thread principal (celui de ta Form donc), en lui envoyant éventuellement des paramètres (tableau d'Object).
Messages postés
46
Date d'inscription
mercredi 25 juillet 2012
Statut
Membre
Dernière intervention
12 septembre 2013
1
Compagnon flemmards ! Oui j'ai vue la page en Francais ^^ .
Par contre pourrait-tu me montrer comment utiliser l'invok ? parsque sur appareils.. le backgroundworker n'existe pas je suis un peu bloquer :XXXXX
Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
146
Bonjour,

Le baackgroundworker est juste une implémentation plus Developper Friendly du thread, donc tu fais un thread comme d'habitude et ça sera bon.

Mon site
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
1
Du coup moi je l'utilise mais en réceptionnant des évènements, donc ça complique un peu...
La fonction qui t'intéresse dans leur tuto, ce serait ça :
private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox1.InvokeRequired)
{	
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}


Si tu veux pas te faire chier, tu vire la condition, tu garde que l'invoke dans le if !
Il faut créer un délégué (chez eux : "SetTextCallback"), pour toi il faut déclarer un délégué sans paramètres (parce que ta fonction DoWorkPanel n'en a pas).
Tu instancie un délégué de ce type (ils l'on appelé "d"), dans lequel tu entre la méthode à appeler (pour toi "DoWorkPanel").
Ensuite il ne reste qu'à faire l'Invoke (comme ci-dessus), avec ton délégué, puis des paramètres vide (null ? ça doit y aller ^^) !
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Statut
Membre
Dernière intervention
21 décembre 2012
1
Le résultat, c'est que ce thread va demander au thread principal de ta form d'exécuter la méthode DoWorkPanel, au lieu du treahd "secondaire" !
Pourquoi on doit utiliser un délégué ? J'en sais rien, je suis pas assez pointu ^^
Et du coup, c'est bien dans ton thread que tu exécute tout ça !
Messages postés
46
Date d'inscription
mercredi 25 juillet 2012
Statut
Membre
Dernière intervention
12 septembre 2013
1
Ben parfait merci beaucoup ^^ j'essaye dessuite !