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 :
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
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 { ;} } }
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.
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(); } } }
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.
Partager