Bonjour à tous,

Je dois réaliser un "mini automate" pour dialoguer avec une machine. (Communication par RJ45 interface I/O Sealevel)
Je me suis inspiré du Grafcet ou chaque étape correspond à une méthode et à un thread.

Mon thread lance une méthode avec en paramétrage un tableau bool etat1.
Ensuite ce tableau est récupéré dans ma boucle principale pour exécuter des actions (GestionCycle).

J'ai besoin de votre avis pour évaluer l'implémentation du thread et du tableau bool etat1.
J'ai le sentiment que ce n'est pas très propre même si ça fonctionne !

En vous remerciant pour votre analyse.
Cordialement.
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
86
87
88
89
90
91
92
93
94
95
96
97
98
 
     #region TimeOut
        // Affichage en cas de défaut
        private delegate void MonText(String textDefaut, Color c);
        private void AfficheDefaut(String textDefaut, Color c)
        {
            tbInfo.Clear();
            tbInfo.ForeColor = c;
            tbInfo.AppendText(textDefaut + "\n");
        }
 
        private Boolean TimeOut(object wd) // Retourne true si le temps est dépassé
        {
            WatchDog w = (WatchDog)wd;
            return w.Elapsed;
        }
        #endregion TimeOut
 
        #region Etape1 Grafcet
        private void Etape1(bool[] etat)
        {
            bool chgtEtat = false; 
            WatchDog wd = new WatchDog(5000); // Lance un timer de 5 secondes 
            while (!chgtEtat && !TimeOut(wd))
            {
                if (e1)  // variable  entrée N°1
                {
                    chgtEtat = true;
                    etat[1] = true; 
                }
 
                s1 = true;       // variable sortie n°1 
                etat[0] = true;  // état sortie activée
            }
 
            if (TimeOut(wd))
                etat[2] = true; // état temps dépassé
 
            etat[3] = true;     // état terminé
 
            AffichageLed(); // Visualisation des leds entrées sorties
            wd.Kill(); // arrêt timer
        }
        #endregion Etape1
 
        #region Etape2
        private void Etape2(bool[] etat)
        {
	//  idem étape 1 avec des entrées sorties différentes
        }
        #endregion Etape2
 
 
//Boucle du cycle
 private Thread[] Etape = new Thread[10]; // Déclaration tableau de 10 thread
 private void GestionCycle()
 {   
            stopCycle = false;
 
            while (!stopCycle)
            {
                // Départ Cycle
                if (departCycle) // Si condition de départ
                {
                    departCycle = false;
 
 
                   // J'ai besoin de votre analyse sur cette partie region Etape 1 & 2
                    #region Etape 1 & 2
                    // Thread Etape 1 
                    bool[] etat1 = new bool[4]; // tableau état de la méthode Etape1
                    Etape[1] = new Thread(() => { Etape1(etat1); }); 
                    Etape[1].Start(); 
 
                    //Etape 2
                    bool[] etat2 = new bool[4]; 
                    Etape[2] = new Thread(() => { Etape2(etat2); });
                    Etape[2].Start();
 
                    while (!etat1[2] && !etat1[3]) { } // attente de la fin de l’exécution étape 1
                    while (!etat2[2] && !etat2[3]) { } //  attente de la fin de l’exécution étape 2
                    Etape[1].Abort(); // Suppression thread 
                    Etape[2].Abort(); // Suppression thread 
 
	            // Affichage si défaut
                    if (etat1[2])
                        Invoke(new MonText(AfficheDefaut), "Erreur Etape 1 !!", Color.Red);
 
                    if (etat2[2])
                        Invoke(new MonText(AfficheDefaut), "Erreur Etape 2 !!", Color.Red);
                    #endregion Etape 1 & 2
 
                    //  et ainsi de suite pour les autres étapes. ..........................
 
	  }
 
	  Thread.Sleep(100); // attente 100 ms
}