Bonjour,

Je souhaite afficher un avertissement dans une MessageBox.
Ce formulaire sera "Closed()" quand la condition aura disparue.
La détection se fait périodiquement à échéance d'un Timer.

ma première classe surveille donc la condition et poste des événements de pilotage du formulaire :
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
 
    public class SurveyEvt
    {
        #region Evénements
 
        public event EventHandler On_Absent;
        public event EventHandler On_Present;
 
        #endregion
 
        private System.Threading.Timer periodicalSurveyTimer;
        private string ComPort;
        public TimerCallback SurveySystem_Delegate;
 
        #region Constructeur
 
        public SurveyEvt()
        {
        }
 
        #endregion
 
        public void SystemCheck(Object NoStatusToManage)
        {
            //
            // Pour Debug
            // 
            this.Stop_SystemSurvey();
            //
            // Fin
 
            PortComExtSystem mySystem= new PortComExtSystem ();
            // Si le système ne répond plus
            if (!mySystem.isPresent())
            {
                //// C'est qu'il est absent
                this.OnChronoSystem_Absent(this, new EventArgs());
            }
            else
            {
                this.OnChronoSystem_Present(this, new EventArgs());
            }
 
            //
            // Pour Debug
            // 
            this.Start_SystemSurvey();
            //
        }
        /// <summary>
        /// arrête le Timer de la surveillance de présence du système
        /// </summary>
        public void Stop_SystemSurvey()
        {
            try
            {
                if (this.periodicalSurveyTimer != null)
                {
 
                    this.periodicalSurveyTimer.Dispose();
                    this.periodicalSurveyTimer = null;
                }
            }
            catch { ;}
        }
        /// <summary>
        /// démarre ou relance (si déjà en cours) une période de surveillance de présence du système 
        /// </summary>
        public void Start_SystemSurvey()
        {
            try
            {
                if (this.periodicalSurveyTimer == null)
                {
                    this.periodicalSurveyTimer = new System.Threading.Timer(SurveySystem_Delegate, null, 4000, 4000);
                }
                else
                {
                    this.Stop_SystemSurvey();
                    this.periodicalSurveyTimer = new System.Threading.Timer(SurveySystem_Delegate, null, 4000, 4000);
                }
            }
            catch { ;}
        }
    }
la seconde lance la première et en reçoit les évènements d'affichage/suppression du formulaire.
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
 
    public class SystemSurvey : IDisposable
    {
        public void se_On_Absent(object sender, EventArgs e)
        {
            if (fW == null)
            {
                fW = new frmWarningSystem6();
                fW.Message = "Systeme arrété ou déconnecté !";
            }
            if (!fW.Visible)
                fW.ShowDialog();
 
        }
        public void se_On_Present(object sender, EventArgs e)
        {
            if (fW != null && fW.Visible)
            {
                fW.Close();
                fW = null;
            }
        }
       public SystemSurvey()
        {
            // création de la boucle de surveillance
            // avec ses traitements à échéance
                SurveyEvt se = new SurveyEvt();
                se.On_Absent += new EventHandler(se_On_Absent);
                se.On_Present += new EventHandler(se_On_Present);
                Periodic_SurveySystem_Delegate = new TimerCallback(se.SystemCheck);
                se.SurveySystem_Delegate = Periodic_SurveySystem_Delegate;
                // elle est lancée dans un nouveau Thread (afin de continuer à tourner même quand lle message d'avertissement en DIALOG BOX est affiché).
                mySurveyThread = new Thread(new ThreadStart(se.Start_SystemSurvey));
                mySurveyThread.Start();
            }
        }
}
Le problème que je rencontre et qui semble banal c'est que quand la messageBox est affiché dans le Thread qui a en charge l'affichage du formulaire, le code ne tourne pas du tout dans l'autre Thread.
De plus le code de la seconde classe (affichage) semble être exécuté par le Thread de la 1ère (j'ai contrôlé l'ID).

Les évènements sont donc synchrone et les Thread préemptifs.
ça me semble bien compliqué ! et loin de permettre ce que je veux faire.


Ai-je oublié quelque chose ? quelqu'un adeja trouvé comment sortir de ce problème ?

Merci.