Folgende Situation:
Ich muss mit einem Netzwerkfähigem Gerät über UDP kommunizieren. Ich kann an
das Gerät Befehle schicken und bekomme daraufhin eine Antwort. Je nach dem
wie die Antwort war, muss ich evtl. weitere Befehle an das Gerät senden und
wiederum auswerten.
Jetzt kann es aber auch sein, dass mir das Gerät "ungefragt" UDPPakete
schickt, da sich an seinem Zustand was geändert hat.
Daraufhin muss ich evtl. "Zeitaufwändige" DBAbfragen starten und wiederum
Befehle an das Gerät schicken.
Und zu guter Letzt: Es handelt sich nicht nur um ein Gerät sondern um mehrere.
Was ich bereits habe:
- TIdUDPServer im Main zum empfangen der Antworten bzw. Status
- einen (VCL)Thread (pro Gerät)
- TIdUDPClient im Thread zum senden der Befehle
Ich wollte jetzt eigentlich den Thread über Events triggern. z.B.
Kommen Daten am UDPServer an, werden sie - je nachdem von welchem Gerät sie kamen -
in einen Puffer des dazugehörenden Threads geschrieben und ein Event wird gesetzt. Der Thread
arbeitet je nach empfangenen Daten die Routinen ab und geht dann wieder in
Wartestellung (WaitforMultipleObjects im Execute)
Hier mal Pseudocode aus dem Execute:
Delphi-Quellcode:
while Not Terminated do begin
case WaitForMultipleObjects(2, @FHandles, False, INFINITE) of
WAIT_OBJECT_0 + 0 : Terminate;
WAIT_OBJECT_0 + 1 :
begin
case Buffer of
Antwort1: ;
Antwort2: ;
Antwort3: ;
//...
end;
end;
end;
end;
Das Problem besteht jetzt darin, dass ich z.B. bei Antwort1 mehrere Befehle an das Gerät
schicken müsste, worauf ich dann ja auch wieder Antworten bekomme. Der Thread befindet sich
dann aber nicht in Warteposition sondern irgendwo bei Antwort1. Das wollte ich dann so lösen,
das ich eine Funkion SendeBefehl implementiere.
Delphi-Quellcode:
proceduer SendeBefehl(Befehl);
begin
UDPClient.Send;
WaitForSingleObject
end;
Dazu brauchte ich dann aber wiederum ein neues Event. (Jetzt sind es schon 2)
Nun muss ich aber auch sicherstellen, das der UDPServer nur Daten in den Puffer schreibt, wenn der
Thread Wartet. Somit habe ich 2 weitere Events eingeführt (Ein für das Warten im Execue ein
für SendeBefehl)
Ich vermute mal, dass mein Programmablauf nicht der effektivste ist. Wie würdet ihr
so ein Programm gestalten?
Wie würdet ihr die Daten vom UDPServer an den Thread übergeben?