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