Evaluation de l'implémentation de mes threads
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:
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 lexécution étape 1
while (!etat2[2] && !etat2[3]) { } // attente de la fin de lexé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
} |