Bonjours, j'avais il y a quelque temps fais un programma qui communique en TCP/IP avec un automate

La partie de communication été mise dans un thread indépendant.

Tous fonctionne parfaitement bien, sauf que quelque fois le thread "plante".

Je m'explique : javais mis en place une sécurité, dans le thread de communication il y a une boucle infini, qui lit et écrie les donnée en permanence, et au début de cette boucle jai mis une incrémentation d'une valeur, si cette valeur ne change pas pendant 10 seconde de suite, je considére qu'il est coincé quelque part.
C'est un Timer externe qui fais cette surveillance.


Maintenant je voudrais savoir pourquoi il reste coincé, est ce possible que c'est du au fait que j'utilise des méthode de l'objet TCPClient sans utiliser Synchronize ?

Quelqu'un voie pourquoi de temps en temps le thread peut rester coincé ??

voila le code du thread en question :

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
 
void __fastcall TMonThread::Execute()
{
  int i;
  int iCompteurRead=0;
  int iDebut, iNbr, iIndexRangement=0;
  int iDebutW, iNbrW;
  int iCompteurWrite=0;
  int iIndexRangementW=0;
  AnsiString asTmp;
  TDate d1,d2;
  TCoupleInt *ciCouple;
 
        //CODE DU THREAD DE LECTURE
        //on effectue dabord un sleep pour laiser a la com le temps de s'initialiser
        Sleep(100);
        //on effectue une boucle infinie pour effectuer le meme code a l'infini
        while(Form1->bFinThreadLec)
        {
                Form1->clSurThread.isTCom++;
                if(Form1->clSurThread.isTCom > 10000)
                        Form1->clSurThread.isTCom = 0;
 
                d1=Now();   //recuperation de l'heure au debut de la sequence de requete
                //boucle lisant les deux tableaux ou sont stocker les MW a lire (dans le premier) et le nombre de mw pour chaque requete (dans le deuxieme)
 
                for(iCompteurRead=0;iCompteurRead<(Form1->ListMwRead->Count);iCompteurRead++)
                {
                        if(Form1->iCompteurErreurCom < 2)
                        {
                                ciCouple = (TCoupleInt *)(Form1->ListMwRead->Items[iCompteurRead]);
                                iDebut = ciCouple->Valeur1;
                                iNbr = ciCouple->Valeur2;
                                if(LireMotsModbus(Form1->ListValeurLecture, iDebut, iNbr, iIndexRangement)==false)
                                        Form1->iCompteurErreurCom++;
                                else
                                        Form1->iCompteurErreurCom = 0;
 
                                iIndexRangement = iIndexRangement + StrToInt(ciCouple->Valeur2);
                        }
                }
                iIndexRangement=0;
                iCompteurRead=0;
                //boucle lisant les deux tableaux ou sont stocker les MW a écrire
                //(dans le premier) et le nombre de mw pour chaqur requete (dans le deuxieme)
                for(iCompteurWrite=0;iCompteurWrite<(Form1->ListMwWrite->Count);iCompteurWrite++)
                {
                        if(Form1->iCompteurErreurCom < 2)
                        {
                                ciCouple = (TCoupleInt *)(Form1->ListMwWrite->Items[iCompteurRead]);
                                iDebutW = ciCouple->Valeur1;
                                iNbrW = ciCouple->Valeur2;
                                if(EcrireMotsModbus(Form1->ListValeurEcriture, iDebutW, iNbrW, iIndexRangementW)==false)
                                        Form1->iCompteurErreurCom++;
                                else
                                        Form1->iCompteurErreurCom = 0;
 
                                iIndexRangementW = iIndexRangementW + StrToInt(ciCouple->Valeur2);
                        }
                }
                iIndexRangementW=0;
                iCompteurWrite=0;
                d2=Now();  //recuperation de l'heure a la fin de la sequence de requete
                //calcul du temps en ms qu'a mis le programme pour faire toute les requetes
                Form1->iTempsCom=StrToInt(FormatDateTime("szzz",d2-d1));
                Form1->TimerSurveilance->Enabled = true;
        }
 
        Form1->bTLecFini = true;
}

Cordialement Baxter