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
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS
SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney