Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TidTCPCLient erzeugt Stack-Overflow (https://www.delphipraxis.net/182484-tidtcpclient-erzeugt-stack-overflow.html)

rokli 28. Okt 2014 13:42

TidTCPCLient erzeugt Stack-Overflow
 
Hallo Zusammen!

Mein Programm muß einen, über TCP/IP (IPv4) angeschlossenen, Barcode-Scanner auslesen. Der Scanner befindet sich im lokalen Netzwerk.

Ich verwende einen Timer, um aus einem TIdTCPClient mit TidTCPClient.IOHandler.ReadLn den vom Barcode-Scanner gelesene Wert herauszubekommen. Den gelesenen Wert übertrage ich laufend in einen String. Ist der String <> '' schreibe ich ihn in eine Memo, leere die Variable und es geht von vorne los. Später soll der gelesene Wert dazu dienen, weitere Daten heraus zu suchen.

Im Coding sieht die Schleife so aus:

Delphi-Quellcode:
procedure TfrmMain.timScanTimer(Sender: TObject);
begin
   tag := 5;
   Inc(intLine);               // Durchläufe zählen
   Label1.Caption      := IntToStr(intLine);   // Durchläufe anzeigen
   Application.ProcessMessages;
   
   strLine      := tcpClient.IOHandler.ReadLn;   // Inhalt nach Zwischenvariable
   
   tcpClient.Disconnect;            // Client abschalten
   timScan.Enabled      := false;      // Timer anhalten
   
   if strLine <> '' then begin         // ein Barcode wurde erkannt
      memLog.Lines.Add(TimeToStr(now()) + strLine);   // Barcode in Memo schreiben
      strLine         := '';      // Zwischenvariable leeren
   end;
   
   timScan.Enabled      := true;      // Timer wieder starten
   tcpClient.Connect;            // und Client wieder anschalten
end;
Das funktioniert soweit auch. Aber: Nach ca. 20 - 30 Minuten steigt das Programm aus und meldet einen Stack-Overflow. (Access violation at xxx: write of adress xxx.) Mittlerweile habe ich im Prinzip nur noch diese Timer Prozedur im Programm. Alles drum herum habe ich entfernt, um auszuschließen, dass das Verhalten aus anderen Bereichen herrührt.

Kann mir jemand helfen, und mir sagen, was ich hier falsch mache?

Vielen Dank
Rolf

Uwe Raabe 28. Okt 2014 13:57

AW: TidTCPCLient erzeugt Stack-Overflow
 
Rechnest du auch damit, daß während des Application.ProcessMessages ja auch wieder ein Timer-Event abgearbeitet werden kann? Nimm den Befehl doch testweise einfach mal raus.

Sherlock 28. Okt 2014 13:57

AW: TidTCPCLient erzeugt Stack-Overflow
 
Gibt es da bei den Indys nicht ein Event, das feuert sobald Daten am Socket ankommen? Warum über einen Timer auslesen? Das ist IMHO nicht korrekt.

Sherlock

rokli 28. Okt 2014 14:37

AW: TidTCPCLient erzeugt Stack-Overflow
 
Hallo Uwe,

den Application.Process habe ich eingebaut, um den Zähler sehen zu können; in einer Version vorher hatte ich alles in´s Memo protokolliert ... und das wurde zu lang, also hab ich nur den Zähler ausgegeben. Aber abgebrochen ist das Programm vorher auch.

@Sherlock: Den gibts leider nicht. Daher bin ich auf den Timer gekommen.

Es gibt einen Event

Delphi-Quellcode:
procedure TfrmMain.tcpClientWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
   //
end;
Aber der hat bei mir nicht funktioniert (es gibt auch noch einen onStartWork und onEndWork). Heißt, ich habe keine Daten bekommen.

Bowler 28. Okt 2014 16:42

AW: TidTCPCLient erzeugt Stack-Overflow
 
Müsste das nicht ehr ein TCP-Server sein? So wie ich das sehe schickst Du ja vom Client keinen Befehl an den Scanner, um dann das Ergebnis abzufragen, sondern der Scanner schickt was, wenn er was hat.
Dann könntest Du mit dem OnExecute des TCP-Servers darauf reagieren und schauen was geliefert wird. Ich glaube das ist auch das Event was Sherlock meint.
Der TCP-Server macht ja einen Thread auf und steht dann blockierend auf dem Socket und wartet, bis was ankommt. Wenn was kommt, wird es verarbeitet. Das ganze passiert dann in einer Schleife.

Ich habe leider gerade kein Delphi hier, um genau zu schauen, wie die Events heißen, aber das kam mir gerade in den Sinn, als ich Deinen Beitrag gelesen habe.

Oder verstehe ich das falsch. Das setzt natürlich voraus, dass der Scanner sich zu Deinem Programm verbindet, und was schickt. Dein Programm läuft als Server in einem Loop und reagiert nur.

rokli 29. Okt 2014 06:24

AW: TidTCPCLient erzeugt Stack-Overflow
 
Guten Morgen!

Leider musste ich gestern weg und konnte nicht mehr antworten.

Also es verhält sich so, dass der Barcode Scanner ein TCPServer ist. Und dieser Server sendet das, was er als Barcode gelesen hat. Damit (so habe ich es interpretiert) habe ich auf "meiner" Seite einen TCPClient genommen ... was ja auch in den ersten 15 bis 20 Minuten funktioniert.

Im Moment läuft der Aufbau übrigens wieder ohne den Application.ProcessMessages.

rokli 29. Okt 2014 06:55

AW: TidTCPCLient erzeugt Stack-Overflow
 
Liste der Anhänge anzeigen (Anzahl: 1)
So sieht der Fehler aus, den ich da bekomme.

Sherlock 29. Okt 2014 07:20

AW: TidTCPCLient erzeugt Stack-Overflow
 
Kannst Du eigentlich isolieren, in welcher Zeile der Fehler auftritt? Hast Du sowas wie MadExcept oder EurekaLog?

Ausserdem sellt ein Server in einer normalen Welt Daten bereit, die ein Client abholen kann, so er denn lustig ist. Also müsste es eigentlich so sein, daß in mehr oder weniger Regelmäßigen Abständen Dein client eine Verbindung aufbaut, und mal nachsieht, obs was neues zu holen gibt. Dein Konstrukt sieht mir nicht so ganz danach aus. Aber dazu kenne ich die Indys zu schlecht.

Sherlock

rokli 29. Okt 2014 07:51

AW: TidTCPCLient erzeugt Stack-Overflow
 
Hallo Sherlock,

genauso soll es sein! Innerhalb des Timers wird in der Zeile
Delphi-Quellcode:
strLine = tcpClient.IOHandler.ReadLn
ermittelt, ob der Server etwas bereit gestellt hat. Wenn das der Fall ist, soll der Wert in strLine im if-Konstrukt weiter verarbeitet. Wenn der Server keine Daten bereit gestellt hat, läuft der Timer einfach weiter.

Im Moment Trenne ich die Verbindung vor dem If und Verbinde nach dem If wieder - das werde ich mal in die Schleife verlegen, sodass nur getrennt wird, wenn die Variable gefüllt ist.

Die beiden Tools habe ich leider nicht.

TiGü 29. Okt 2014 08:02

AW: TidTCPCLient erzeugt Stack-Overflow
 
Zitat:

Zitat von rokli (Beitrag 1277810)
Die beiden Tools habe ich leider nicht.

http://madshi.net/madExceptDescription.htm -> zum ausprobieren kann man es kostenlos runter laden!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr.
Seite 1 von 2  1 2      

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