Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Pakete über Sockets versenden, Thread hängt sich auf (https://www.delphipraxis.net/135025-pakete-ueber-sockets-versenden-thread-haengt-sich-auf.html)

Jackie1983 3. Jun 2009 12:08


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:
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;
Die Befehle werden in dieser Art versendet (sJob)
Zitat:

Befehl#13Parameter1#13Par2#13Par3#13#10
Eventuell kann mir ja einer einen Tipp geben.

Mfg

Zerolith 3. Jun 2009 15:14

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:
 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;
Ist da irgendeine Stelle, die z.B. eine VCL Komponente ändert. (Repaint?) Das müsstest du dann mit dem Hauptthread synchronisieren.

z.B. statt:
Delphi-Quellcode:
SYS_PING : begin
  Label1.Caption := 'TEST';
end;
sollte das so sein
Delphi-Quellcode:

procedure ChangeCaption;
begin
  Label1.Caption := 'TEST';
end;

SYS_PING : begin
  Synchronize(ChangeCaption);
end;

Jackie1983 4. Jun 2009 09:10

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 15:03 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