Bonjour, dans le cas d'un r��criture d'un programme g�rant plusieurs acc�s r�seau (2Kbit/s TCP/UDP avec un � quatre modem usb � base de XBee) je voudrais savoir quelle est la meilleure fa�on de traiter les messages.
La version actuelle utilise les composants UDP Indy en mode threaded et les sockets borland (non Indy) en ctnonblocking.
Cette m�thode commence a devenir un peu difficile a maintenir car le code devient indigeste m�me si le traitement des messages re�u se fait dans des DLL pr�vues a cet effet.
Ceci est du au fait que de nouvelles fonctionnalit�s utilisent a chaque fois un nouveau port (par exemple, une fonctionnalit� de t�l�m�trie doit �tre incorpor�e alors que l'on g�re d�j� le traitement de capteurs de temp�rature et de d�bitm�tre et que derri�re ont doit transmettre des messages a une console ou autre).
De m�me, quand je doit faire un ckeck-up des capteurs(toutes les minutes), le programme se freeze litt�ralement en attendant la r�ponse des dits capteurs avant d'envoyer une erreur le cas �ch�ant.
Dans le m�me acabit, ce sont ces m�me fonctions qui envoient les requettes SQL pour archiver les messages.
Petit code exemple (j'en ai 5 comme celui-la):
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
 
/*Fonction de décodage des messages du debimetre*/
void __fastcall TMNFRM::DBM_ServUDPRead(TIdUDPListenerThread *AThread, TBytes AData,
          TIdSocketHandle *ABinding)
{
/*Pour suprimmer l'avertissement W8057*/
AThread;AData;ABinding;
/*~Pour suprimmer l'avertissement W8057*/
DBMDecodeFuncDLL = (DBMDEC)GetProcAddress(hDBMDLL, "DBMdecode");
        if (DBMDecodeFuncDLL)
        {
            AnsiString Result;
            Result=DBMDecodeFuncDLL(12,ABinding->PeerIP,AData,DBM_Serv);
            char *c = Result.c_str();
            char tab[6][20];
            int j = 0;
 
            do
                {
                int k = 0;
                while(*c != ';' && *c) tab[j][k++] = *c++;
                tab[j++][k] = 0;
            } while(*c++);
 
Journal->AddLine( StrToInt(tab[0]),AnsiString(tab[1]),AnsiString(tab[2]),AnsiString(tab[3]),StrToFloat(AnsiString(tab[4])),StrToFloat(AnsiString(tab[5])));
if(!strcmp(tab[3],"DBM: Déreg")) //Le capteur entre en veille automatique (vannes fermées)
{
Capteur[StrToInt(tab[0])].Active=false;
Etat_Capteur(Journal->NameById(StrToInt(tab[0])),2);//
CCDate->Cells[1][StrToInt((tab[0]))]=DateToStr(Date())+" "+TimeToStr(Time());
CCDate->Cells[2][StrToInt((tab[0]))]=DateToStr(Date())+" "+TimeToStr(Time());
 
if (Capteur[StrToInt(tab[0])].visible==true)
{
Capteur[StrToInt(tab[0])].PinRadio->Delete();
Capteur[StrToInt(tab[0])].visible=false;
}
}
if(!strcmp(tab[3],"DBM: Notify"))//Le capteur envoie un signal de type Keep_Alive
{
Etat_Capteur(Journal->NameById(StrToInt(tab[0])),5);
Capteur[StrToInt(tab[0])].Active=true;
Capteur[StrToInt(tab[0])].Timerest=Capteur[StrToInt(tab[0])].Timeinit;
}
if(!strcmp(tab[3],"DBM: ACK"))//Le capteur envoie un signal de type Aquittement après une demande de verification
{
Etat_Capteur(Journal->NameById(StrToInt(tab[0])),5);
Capteur[StrToInt(tab[0])].Active=true;
Capteur[StrToInt(tab[0])].Timerest=Capteur[StrToInt(tab[0])].Timeinit;
}
CCDate->Cells[2][StrToInt((tab[0]))]=DateToStr(Date())+" "+TimeToStr(Time());
if(!strcmp(tab[3],"DBM: Enreg"))//Le capteur sort de la veille automatique (vannes en cours d'ouverture)
{
    Capteur[StrToInt(tab[0])].Active=true;
    Capteur[StrToInt(tab[0])].Timerest=Capteur[StrToInt(tab[0])].Timeinit; //recopier pour toutes les réponses Capteurs
 
Etat_Capteur(Journal->NameById(StrToInt(tab[0])),5);
CCDate->Cells[0][StrToInt((tab[0]))]=DateToStr(Date())+" "+TimeToStr(Time());
CCDate->Cells[2][StrToInt((tab[0]))]=DateToStr(Date())+" "+TimeToStr(Time());
AnsiString request;
request="select * from Parametres where id="+(AnsiString)tab[0];
Config_Capteurs->PSTQuery->Active=true;
Config_Capteurs->PSTQuery->Close();
Config_Capteurs->PSTQuery->SQL->Clear();
Config_Capteurs->PSTQuery->SQL->Add(request);
Config_Capteurs->PSTQuery->Open();
int time_N,time_U;
      time_N=Config_Capteurs->PSTQuery->FieldByName("Periode_scrutation")->AsInteger;
      time_U=Config_Capteurs->PSTQuery->FieldByName("Scrutation_alarme")->AsInteger;
if(Config_Capteurs->PSTQuery->FieldByName("Tracking")->AsString=="Vrai" )
{
      Enable(StrToInt(tab[0]),time_N,time_U,true);//Envoie les messages d'auto tracking au capteur (etat normal + alarme)
}
else
{
Disable(StrToInt(tab[0]),time_U); //Envoie les messages d'auto tracking au capteur (alarme uniquement)
}
}
}
}