![]() |
Pakete über Sockets versenden, Thread hängt sich auf
Servus,
meine Client/Server Anwendung hat bei der übertragung der Pakete noch ein kleines Problem. Wenn ich meine Anwendung über Nacht laufen lasse, kommen irgend wann in der Nacht keine Pakete mehr an. Der Client sendet alle 500ms ein Testpaket. Der Server bringt nur die Meldung "Thread Fehler Zugriff verweigert (5)" Jetzt weis ich aber nicht genau wo der Thread hängen bleibt oder wieso. Das ist meine Methode um die Pakete zu empfangen und dem Thread zu übergeben.
Delphi-Quellcode:
Die Befehle werden in dieser Art versendet (sJob)
procedure TThreadServer.OnSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket); var sBuffer,sJob,s : string; index : integer; cmd,ccmd : TCommandHandling; cd : TClientData; begin sBuffer := Socket.ReceiveText; //Sammeln von Jobs bis diese komplett sind index := fBufferJobs.IndexOfObject(socket); if index = -1 then begin fBufferJobs.AddObject(sBuffer,socket); index := fBufferJobs.Count-1; end else fBufferJobs.Strings[index] := fBufferJobs.Strings[index] + sBuffer; //Wenn komplett weiter zur Jobverarbeitung sJob := ''; s := fBufferJobs.Strings[index]; while Pos(#13#10,s) <> 0 do begin sJob := copy(s,0,Pos(#13#10,s)+1); //ersten befehl auslesen Delete(s,1,length(sJob)); //befehl löschen aus kette fBufferJobs.Strings[index] := s; //rest wieder zurück if s = '' then begin //leer, dann löschen fBufferJobs.Objects[index] := nil; fBufferJobs.Delete(index); end; //Systembefehl? wenn ja direkt verarbeiten und den rest weiter //zur jobverabeitung weitergeben. if sJob <> '' then begin cmd := TCommandHandling.Create(CMDNone,''); cmd.SetFrames(sJob); case cmd.GetCmd of SYS_ALIVE : begin //... end; SYS_PING : begin //... end; SYS_AUTHKEY : begin //... end; CMDError : begin //... end; else //kein systembefehl weiter bearbeiten fJobThread.AddJobToSocket(socket,sJob); end; cmd.Free; end; end; end; Zitat:
Mfg |
Re: Pakete über Sockets versenden, Thread hängt sich auf
Habs jetzt nur kurz überflogen, aber ggf. wäre interessant was hier passiert:
Delphi-Quellcode:
Ist da irgendeine Stelle, die z.B. eine VCL Komponente ändert. (Repaint?) Das müsstest du dann mit dem Hauptthread synchronisieren.
case cmd.GetCmd of
SYS_ALIVE : begin //... end; SYS_PING : begin //... end; SYS_AUTHKEY : begin //... end; CMDError : begin //... end; else //kein systembefehl weiter bearbeiten fJobThread.AddJobToSocket(socket,sJob); end; z.B. statt:
Delphi-Quellcode:
sollte das so sein
SYS_PING : begin
Label1.Caption := 'TEST'; end;
Delphi-Quellcode:
procedure ChangeCaption; begin Label1.Caption := 'TEST'; end; SYS_PING : begin Synchronize(ChangeCaption); end; |
Re: Pakete über Sockets versenden, Thread hängt sich auf
Bei den Systembefehlen werden keine Eigenschaften der Hauptform aufgerufen.
Kann mir nur eventuell vorstellen das der Thread einen Befehl bekommt der nicht stimmt, bzw irgend wie "kaputt" gegangen ist, nur das kann ich schlecht nachvollziehen. genauso wenn die Anwendung läuft belegt die anwendung nach einem Tag ca. 30MB Ram. Wenn ich die beende wird aber nichts angezeigt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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