Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Blockende Kommunikation mit VCL? (https://www.delphipraxis.net/187514-blockende-kommunikation-mit-vcl.html)

Phunkafizer 5. Dez 2015 20:21

Blockende Kommunikation mit VCL?
 
Hallo,

ich habe ein kleines Delphiprogramm das ein externes Gerät über eine serielle Schnittstelle ansteuert. Auf Knopfdruck kann ich ein Kommando etwa so senden:

Delphi-Quellcode:
procedure TForm1.OnButton1Click;
begin
  device.transfer("cmd1");
end;
Schritt 2: Nun möchte ich aber auch die Antwort empfangen und auswerten, und habe dazu einen eigenen Thread der von der seriellen Schnittstelle liest, und darin eine Synchronize-Methode aufruft, um die empfangenen Daten anzuzeigen. Das klappt auch soweit gut.

Schritt 3: Die Methode "transfer" soll blocken, bis etwas empfangen wurde, oder ein Timeout auftritt. Dazu habe ich in der Com-Klasse ein TEvent, auf welches ich nach dem senden mit .WairFor warte, und im Empfangsthread das Event setzte, auch das klappt soweit:

Delphi-Quellcode:
procedure TForm1.OnButton1Click;
var
  msg: string;
begin
  msg := device.transfer("cmd1");
  ShowMessage(msg);
end;


function TDevice.transer(cmd: string): string;
begin
  com.send(cmd);
  Event.WaitFor(1000);
  Result := RxThread.RxBuffer;
end;

procedure TRxThread.OnReceive;
begin
  Event.SetEvent;
end,
Schritt 4: Nun sollen noch Sende- und Empfangsdaten auf der MainForm angezeigt werden. Und hier kommt das Problem: Wenn ich in Transfer die Sendedaten auf der MainForm anzeige, werden die Daten erst angezeit wenn die Methode zurückkommt, und eigentlich müsste man ja den Zugriff auf den VCL Thread noch synchronisieren, aber selbiger ist ja gerade geblockt :?

Wie müsste ich das Design ändern um die beschriebene Funktionalität zu bekommen?

Stefan

Neumann 6. Dez 2015 14:28

AW: Blockende Kommunikation mit VCL?
 
Warum nicht mit fertiger Komponente z.B. TComport das ganze realisieren?

Was mir noch auffällt:

1. Showmessage muss der Anwender immer schließen. Warum nicht die Meldungen z.B. in ein Memo schreiben?

2. Rückmeldungen dann z.B. verwerfen, wenn NOW eine Startzeit + x überschreitet, dann braucht man kein waitfor.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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 by Thomas Breitkreuz