AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Blockende Kommunikation mit VCL?

Ein Thema von Phunkafizer · begonnen am 5. Dez 2015 · letzter Beitrag vom 6. Dez 2015
Antwort Antwort
Phunkafizer

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

Blockende Kommunikation mit VCL?

  Alt 5. Dez 2015, 19: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
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
529 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Blockende Kommunikation mit VCL?

  Alt 6. Dez 2015, 13:28
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.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz