![]() |
Programmdesign / Kommunikation mit Gerät über UDP
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:
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:
Das Problem besteht jetzt darin, dass ich z.B. bei Antwort1 mehrere Befehle an das Gerät
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; 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:
Dazu brauchte ich dann aber wiederum ein neues Event. (Jetzt sind es schon 2)
proceduer SendeBefehl(Befehl);
begin UDPClient.Send; WaitForSingleObject end; 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? |
Re: Programmdesign / Kommunikation mit Gerät über UDP
Moin moin,
habe es vermutlich nicht verständlich genug erklärt... Naja, ich habe es - wie oben beschrieben - umgesetzt, also ich trigger meine Threads mit Events. UND... es funktioniert ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz