Einzelnen Beitrag anzeigen

Phunkafizer

Registriert seit: 9. Mär 2005
Ort: Fürth
18 Beiträge
 
#1

Blockende Kommunikation mit VCL?

  Alt 5. Dez 2015, 20:21
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
  Mit Zitat antworten Zitat