Forcer l'activité d'une thread [Résolu]

Signaler
Messages postés
19
Date d'inscription
lundi 14 juin 2004
Statut
Membre
Dernière intervention
1 août 2007
-
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011
-
Bonjours, alors voila ce que je voudrais faire:

Je cré un objet qui instentie une icone de notification qui reste bien sagement en attente de recevoir un clic pour afficher un menu.
Je veux lancer son activité dans une thread.

Ce que j'ai fais :

dans le Main :

        private static void AmorceModuleInterface(){
            ModuleInterface LeModuleInterface = new ModuleInterface();
        }
        private static void DemarrerModuleInterface(){
            TacheModuleInterface=new Thread(AmorceModuleInterface);
            TacheModuleInterface.Start();
        }

dans ma classe

    class ModuleInterface{
        private static NotifyIcon in_Icone=new NotifyIcon();
        public ModuleInterface(){
            in_Icone.Click += new EventHandler(in_Icone_Click);
            in_Icone.Icon = new System.Drawing.Icon("../../../Images/Icone.ico");
            in_Icone.Text = "SuperVision";
            in_Icone.Visible = true;
        }
        public static void AfficherMenu(){
            new frm_Menu().ShowDialog();
        }
        private void in_Icone_Click(object sender, EventArgs e){   
            AfficherMenu();
        }

Le problème :
La thread se termine tout de suite au lieu d'attendre de detecter un clic et donc l'icone disparait de suite

Merci de votre aide

6 réponses

Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

cela est tout normal avec ce code,
pour t'expliquer de facon plus simple un thread est comparable a un 2ieme process en mémoire qui s'execute en parallèle.
dans un programme que se passe il quand tu ecris :
Sub Main { ...}
et qu'il arrive a la "}" du main ? le programme se referme

il en va de même pour les thread si tu fait :
        private static void DemarrerModuleInterface(){
            TacheModuleInterface=new Thread(AmorceModuleInterface);
            TacheModuleInterface.Start();
        }
        private static void AmorceModuleInterface(){

            ModuleInterface LeModuleInterface = new ModuleInterface();

        }

une fois arrivé a l'accolade rouge le thread a fini son execution detruit ses ressources et se termine donc en l'occurence ici ton icone ect ...

pour cela il faut que tu dise a ton thread de boucler tant que sa tache n'est pas fini :

Private static void AmorceModuleInterface(){

try

{

       While(!bTacheFini) //bTacheFini est un paramètre de bouclage ca peut tres bien etre un membre d'une autre calsse, une variable de classe, internal ect ... a toi de voir les condition de bouclage

        {

        ModuleInterface LeModuleInterface = new ModuleInterface();

Application.DoEvents(); //permet a l'appli de traiter les evenementect .. (tel que l'affichage) cf la doc pour l'explication exacte

Threading.Thread.CurrentThread.Sleep(200); //Dit au thread courrant de s'arreter 200 millisecond (pas besoin qu'il tourne comme un dingue en roue libre) ca laisse du repis au CPU et cie (a toi d'ajuster ce delai)

        }

}

catch(ThreadAbortException e) {
//Catch quand on appelle le .Abort du thread a toi de voir comment tu l'arrete
//cette exception peut donc etre "logique" si tu fait un .abort()
}

}

TeBeCo
Messages postés
19
Date d'inscription
lundi 14 juin 2004
Statut
Membre
Dernière intervention
1 août 2007

hum...c'est pas vraiment la solution que je cherche.
En fait j'espairais qu'il existé un truc genre WaitEvent(clicsouris) pour eviter d'avoir à faire une boucle
Tu vois, genre un truc qui interrompt le traitement comme quand tu ouvres un form et où le capteur d'evenement reste en detection
Pasque quand t'ouvres un form le Event il est en attente, et la je voudrais faire la meme chose mais sans form
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
Quand tu ouvres une Form, il se passe exactement ce que te dis TeBeCo : une boucle infinie qui attend un message (sauf que tu ne le vois pas dans ton code). C'est grosso modo ce que fait l'appel a application.run dans le programme Main.

<hr size="2" width="100%" />Working as designed
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
D'ailleurs si ça te gène te gérer toi même ce thread, tu peux utiliser la méthode suivante :
Créer un projet "application WinForm", et associer ta NotifyIcon à la Form principale : elle sera "vivante" tant que la form principale restera ouverte. Et si tu ne veux pas avoir de Form dans ton projet, il te suffit de faire un "Hide" au démarrage de ton appli (ou par exemple d'utiliser la form principale comme un splash screen, que tu affiche au lancement et que tu cache au bout de quelques seconde -> mais sans la fermer, de sorte que ta notify icon reste visible).

<hr size="2" width="100%" />Working as designed
Messages postés
19
Date d'inscription
lundi 14 juin 2004
Statut
Membre
Dernière intervention
1 août 2007

merci bcp pour vos reponses, je connaissais pas le fonctionnement de DoEvents
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

j'ai oublié un truc essentiel d'ailleurs :
quand tu créé ton thread oublie pas ca :

        private static void DemarrerModuleInterface(){
            TacheModuleInterface=new Thread(AmorceModuleInterface);
            TacheModuleInterface.IsBackground = True; // Les 2 lignes parlent d'elles mêmes
            TacheModuleInterface.Priority = Priority.Lowest;
            TacheModuleInterface.Start();
        }

TeBeCo