AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Daten abholen bei TCPClient
Thema durchsuchen
Ansicht
Themen-Optionen

Daten abholen bei TCPClient

Ein Thema von Schuby · begonnen am 2. Jan 2025 · letzter Beitrag vom 6. Jan 2025
Antwort Antwort
Schuby

Registriert seit: 25. Dez 2018
111 Beiträge
 
#1

AW: Daten abholen bei TCPClient

  Alt 2. Jan 2025, 16:16
Danke für eure Hilfe.
ich habe mir das mal angeschaut.

https://stackoverflow.com/questions/...t-receive-text
https://en.delphipraxis.net/topic/40...-tidtcpclient/

Aber das ist noch zu hoch für mich, da brauche ich noch ein paar
Jahre um da durch zu blicken.


mfg
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
172 Beiträge
 
Delphi 12 Athens
 
#2

AW: Daten abholen bei TCPClient

  Alt 2. Jan 2025, 16:40
Das Thread-Beispiel aus Stackoverflow ist eigentlich recht übersichtlich. Versuch es doch einfach mal damit und melde Dich, wenn Du Fragen hast.

Wenn Du ein aktuelles Delphi verwendet, würde es noch etwas einfacher gehen mit der Parallel Programming Library. Ich meine, das gab es ab Delphi XE7.

In etwa so (nicht getestet!)

Delphi-Quellcode:
uses System.Threading;

...

Procedure TForm1.Readdata;
var
 aTask: ITask;
begin
 aTask := TTask.Create(
   procedure
   var s: string;
   begin
     while true do
     begin
       s := TCPClient.IOHandler.ReadLn();
       TThread.Synchronize(nil,
       procedure
       begin
          Memo1.lines.add(s);
       end);
     end;
   end);
   aTask.Start;
end;
Da muss natürlich noch eine Abbruchbedingung rein statt dem "while true".
  Mit Zitat antworten Zitat
Schuby

Registriert seit: 25. Dez 2018
111 Beiträge
 
#3

AW: Daten abholen bei TCPClient

  Alt 2. Jan 2025, 17:50
Guten abend,
ich habe dein Code mit dem Thread getestet, aber da bekomme ich noch Probleme.
Mein großes Problem ist das ich Daten von einen ESP32 (micro SD Card auslesen) bekomme, aber viele strings mit #13#10

Ich hatte mal vor langer Zeit einen Thread gebastelt und dieser läuft super.
Ich habe es jetzt so gemacht.

Delphi-Quellcode:
procedure TMyThread.Execute;
var i : integer;
Begin
  while bool = true do
  begin
    if Form1.TCPClient.Connected = true then
    begin
      if not Form1.TCPClient.IOHandler.InputBufferIsEmpty then
      begin
        rec_str:= Form1.TCPClient.IOHandler.ReadLn();
        Form1.Edit10.Text:= Form1.Edit10.Text +rec_str;
        Form1.Memo1.Lines.Add(rec_str);
      end;
    end;
  end;
End;

Wenn ich den Befehl ListDir an den ESP32 sende lösche ich vorher Memo1.clear damit ich meinen String
alleine im Memo Feld habe, danach kopiere ich Empfstr:= Memo1.lines.text; in den Empfstr..
Weil ich den Empfstr in meiner Procedure ListBox zerlege.
aber dieser wird nicht kopiert Empfstr ist leer
Deswegen musste ich Edit10 füllen Form1.Edit10.Text:= Form1.Edit10.Text +rec_str;

Jetzt drücke ich eine taste Button10

Delphi-Quellcode:
procedure TForm1.Button10Click(Sender: TObject);
begin
  Empfstr:= memo1.Lines.Text;
  Proc_Fat16_Dir_anzeigen;
end;
Und jetzt wird die Listbox verarbeitet wie im Bild gezeigt.
Was passiert da, bin ich zu schnell im Programm ?
Das Memo1 noch gar keine Daten hat wenn ich meine
Proc_Fat16_Dir_anzeigen; aufrufe ?

Aber so bekomme ich meine daten vom ESP32 sehr gut.

mfg
Angehängte Grafiken
Dateityp: jpg MyProggy.jpg (115,3 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
172 Beiträge
 
Delphi 12 Athens
 
#4

AW: Daten abholen bei TCPClient

  Alt 2. Jan 2025, 18:12
Wenn das Readln in meinem Beispiel leere Zeilen zurückgibt, kannst Du die ja ausschließen mit if s<> '' then...
Ich ging davon aus, dass die Funktion erst zurückkehrt, wenn tatsächlich neue Daten gelesen wurden.

In Deinem Thread gibt es noch ein Problem: Du solltest nicht einfach aus dem Thread auf die Controls Memo1 und Edit10 zugreifen. Dafür war das Synchronize in meinem Beispiel da.

In Deinem Beispiel müsste das etwa so aussehen:
Delphi-Quellcode:
        rec_str:= Form1.TCPClient.IOHandler.ReadLn();
 Synchronize(
      procedure
      begin
        Form1.Edit10.Text:= Form1.Edit10.Text +rec_str;
        Form1.Memo1.Lines.Add(rec_str);
      end);
Ich habe nicht ganz verstanden, was Du mit "bin ich zu schnell im Programm" meinst, aber vielleicht ist das damit ja gelöst
  Mit Zitat antworten Zitat
Schuby

Registriert seit: 25. Dez 2018
111 Beiträge
 
#5

AW: Daten abholen bei TCPClient

  Alt 3. Jan 2025, 06:47
Guten morgenm, ich werde mein Problem doch etwas besser beschreiben.
Ich habe an meinen ESP32 eine micro SD Card und diese will ich auch
auslesen. Mit Butten ListDir.

Der Thread Funktioniert Super ich bekomme alle Daten rein.

Delphi-Quellcode:
procedure TMyThread.Execute;
var i : integer;
Begin
  while bool = true do
  begin
    if Form1.TCPClient.Connected = true then
    begin
      if not Form1.TCPClient.IOHandler.InputBufferIsEmpty then
      begin
        rec_str:= Form1.TCPClient.IOHandler.ReadLn();
      Synchronize(
          procedure
          begin
            Dir_List_str:= Dir_List_str +rec_str;
            Form1.Memo1.Lines.Add(rec_str);
          end);
      end;
    end;
  end;
End;
Den Dir_List_str:= ''; leere ich bevor ich den Befehl Form1.TCPClient.IOHandler.Writeln('D' +#12); sende.


Hier meine Button ListDir;
Delphi-Quellcode:
//List Dir
procedure TForm1.ListDirClick(Sender: TObject);
begin
  Dir_List_str:= '';
  memo1.Clear;
  ListBox1.Clear;
  Form1.TCPClient.IOHandler.Writeln('D' +#12);
  showmessage('Dir List eingelesen.!');
  Proc_Fat16_Dir_anzeigen;
end;
jetzt muss ich showmessage('Dir List eingelesen.!'); vorher machen,
mache ich das nicht und gehe dann sofort in Proc_Fat16_Dir_anzeigen.
Ist der Dir_List_str leer.

es ist mir schon klar wenn ich den Befehl Form1.TCPClient.IOHandler.Writeln('D' +#12); sende
das es eine Zeitlang dauert bis die Daten da sind.

Ich denke ich gehe zu schnell in meine Proc_Fat16_Dir_anzeigen;


Ich hoffe ich habe das jetzt besser erklärt.

mfg
  Mit Zitat antworten Zitat
hes

Registriert seit: 21. Apr 2024
Ort: Baden Württemberg
19 Beiträge
 
Delphi 12 Athens
 
#6

AW: Daten abholen bei TCPClient

  Alt 3. Jan 2025, 08:46
Hallo Schuby,

also wenn ich dich richtig verstehe sendest du mit Form1.TCPClient.IOHandler.Writeln('D' +#12); deinen Befehl damit dein ESP32 die Daten senden soll. Ich hab mal meine 22 Jahre alte Routine genommen wo ich in einer CNC-Maschine Daten abfrage. Das Gegenstück ist dort ein von mir erstelltes Delphi-Servermodul. Bei meinem Client hole ich es so ab:
Delphi-Quellcode:
var
  AStream: TMemoryStream;
  SimulationsPfad, ctdata, LInString: string;
begin

... hier müsstest du noch SimulationsPfad, ctdata mit deinem Zielpfad ersetzen


    if(IdTCPClient.Connected = FALSE) then IdTCPClient.Connect;
    try
      StatusBar.Panels.Items[0].Text := 'Werkzeugdaten online aus Maschine abfragen...';

      IdTCPClient.IOHandler.WriteLn('D' +#12); // Hier war mein Befehl
      AStream := TMemoryStream.Create;

      //OutputDebugString('Readstream...');
      IdTCPClient.IOHandler.ReadStream(AStream, -1, FALSE);
      //ShowMessage(IntToStr(AStream.Position));

      AStream.Position := 0;
      AStream.SaveToFile(SimulationsPfad + ctdata);
      OutputDebugString(pchar('Stream gelesen und gesichert in ' + SimulationsPfad + ctdata));

      FreeAndNil(AStream);
      LInString := IdTCPClient.IOHandler.ReadLn; // Kann sein das brauchst du nicht
    finally
      StatusBar.Panels.Items[0].Text := '';
      IdTCPClient.Disconnect;
    end;
Hab mal meinen Befehl mit deinem ersetzt. Statusbar etc. kannst, raus werfen vielleicht funktioniert es mit deinem ESP32.
Rainer

Geändert von hes ( 3. Jan 2025 um 08:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
172 Beiträge
 
Delphi 12 Athens
 
#7

AW: Daten abholen bei TCPClient

  Alt 3. Jan 2025, 09:42
Das war ja noch so eine unklare Geschichte: Wann ist die Übertragung beendet? Schließt die Gegenstelle die Verbindung, wenn alles übertragen wurde? Oder sendet sie ein bestimmtes Zeichen?

Wird denn der Thread beendet, wenn die Übertragung abgeschlossen ist? Du könntest dann entweder nach der Schleife im Thread mit Synchronize die Funktion aufrufen (Proc_Fat16_Dir_anzeigen), um die Daten in der Listbox auszugeben oder Du verwendest das OnTerminate-Ereignis des Threads, das Dich informiert, wenn der Thread beendet wurde.

Wird der Thread nicht beendet und wartet ewig auf weitere Daten des ESP32, müsstest Du eine Abbruchbedingung haben. Das müsste ja aus der Dokumentation hervorgehen. Wird evtl. auch ein Zeichen #12 gesendet, wie Du es beim Senden von Daten verwendest?
Dann könntest Du evtl. mit ReadLn(#12) arbeiten, das dann in einem Rutsch die Daten bis zu diesem Zeichen zurückgibt. Oder mit WaitFor(#12) auf das Zeichen warten und dann den Buffer auslesen.
  Mit Zitat antworten Zitat
Schuby

Registriert seit: 25. Dez 2018
111 Beiträge
 
#8

AW: Daten abholen bei TCPClient

  Alt 3. Jan 2025, 11:32
Es ist geschafft.! So gehts und ich bin zufrieden.
ok ok das ok1 mit LF könnte ich noch anders machen.
Na mal sehen


Delphi-Quellcode:
procedure TMyThread.Execute;
var i : integer;
Begin
  while bool = true do
  begin
    if Form1.TCPClient.Connected = true then
    begin
      if not Form1.TCPClient.IOHandler.InputBufferIsEmpty then
      begin
        rec_str:= Form1.TCPClient.IOHandler.ReadLn();
        // rec_str:= Form1.TCPClient.IOHandler.InputBufferAsString;
        if rec_str = 'ok1then
        begin
          Form1.Proc_Fat16_Dir_anzeigen;
          rec_str:= '';
        end;
      Synchronize(
          procedure
          begin
            Dir_List_str:= Dir_List_str +rec_str;
            Form1.Memo1.Lines.Add(rec_str);
          end);
      end;
    end;
  end;
End;
Ich Danke allen das ihr einen alten Mann (fast 70zig) geholfen habt.



mfg
  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 06:51 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