AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Pakete über Sockets versenden, Thread hängt sich auf
Thema durchsuchen
Ansicht
Themen-Optionen

Pakete über Sockets versenden, Thread hängt sich auf

Ein Thema von Jackie1983 · begonnen am 3. Jun 2009 · letzter Beitrag vom 4. Jun 2009
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Pakete über Sockets versenden, Thread hängt sich auf

  Alt 3. Jun 2009, 13:08
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
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Pakete über Sockets versenden, Thread hängt sich auf

  Alt 3. Jun 2009, 16:14
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;
Daniel
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#3

Re: Pakete über Sockets versenden, Thread hängt sich auf

  Alt 4. Jun 2009, 10:10
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.
  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 18:21 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