Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TClientSocket funktioniert nicht in einem Thread!? (https://www.delphipraxis.net/88639-tclientsocket-funktioniert-nicht-einem-thread.html)

override 18. Mär 2007 17:12


TClientSocket funktioniert nicht in einem Thread!?
 
Hallo Community,

ich habe folgendes Problem:
Ich hab einen Thread erstellt, der nur dafür verwendet wird,
eine Verbindung zu meiner Server-Anwendung herzustellen
und in einer Schleife auf Pakete zu warten.

Angeblich ist der Client verbunden, aber Server-seitig besteht keine Verbindung.
Liegt das vermutlich an dem Blocking-Mode?
In Zeile 65 wird der Thread übrigens im Debugger (ohne Meldung) verlassen,
direkt nach Socket.SendBuf.

Der Code sieht etwas komisch aus - ist momentan noch experimenteller Code.

Delphi-Quellcode:
function TNetThread.MadeConnection(): Boolean;
var                
  Buf_:   TBuffer;
  FileStream: TFileStream;
  GAME_PATH: String;
begin
  //Init
  GAME_PATH := ExtractFilePath(ParamStr(0));
  //Lade Server-Daten
  FileStream := TFileStream.Create(GAME_PATH+'Server.tmp',fmOpenRead);
  buf_ := TBuffer.Create(0);
  buf_.LoadFromStream(FileStream,Integer(FileStream.Size));
  TCPSock := TClientSocket.Create(nil);
  with TCPSock do begin
    Address    := buf_.GetString();
    buf_.GetBuf(@Port,4);
    ClientType := ctNonBlocking;
  end;
  buf_.Free();
  FileStream.Free();
  //Verbinde und warte 1 sec. für Verbindung
  TCPSock.Open();
  //buf_ := TBuffer.Create(1);
  //SendServer(#0,buf_);
  //buf_.Free();
  //Sleep(1000);
  if (TCPSock.Socket.Connected) then begin
    Result := True;
  end
  else Result := False;
end;


procedure TNetThread.Execute();
var
  len:     Cardinal;
begin
  //Init
  NetBuf := nil;
  Stream := nil;
  GMNet  := nil;
  NetBuf := TBuffer.Create(512);
  //Verbindung zum Server herstellen
  if not MadeConnection then Destroy();
  repeat
    Sleep(100);
  until InGame^;
  if not (TCPSock.Socket.Connected) then Destroy();

  //Empfange Daten
  try
    Stream := TWinSocketStream.Create(TCPSock.Socket,600000); //TimeOut
  except
    Destroy();
    Exit;
  end;

  try
    GMNet := TGMNet.Create();
  except
    Destroy();
    Exit;
  end;
  NetBuf.ResetVars();
  SendServer(NET_INIT,NetBuf);
 
  while (not Terminated) and TCPSock.Socket.Connected do begin
    if Stream.WaitForData(Stream.TimeOut) then begin
      try
        len := NetBuf.LoadFromStream(Stream,512);
        if (len > 0) then begin
          //Buf_.ReSize(len);
          GMNet.RunLines(NetBuf);
        end;
        //else
        //  Break;
      except
        Break;
      end;
    end
    else
       TCPSock.Socket.Close;
  end;

  //CleanUp
  Destroy();
end;
Mit freundlichen Grüßen

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]

Zacherl 17. Jun 2007 13:36

Re: TClientSocket funktioniert nicht in einem Thread!?
 
Habe ein ähnliches Problem. Und zwar versuche ich in einer repeat Schleife innerhalb eines Threads mein ClietntSocket zu meinem Server verbinden zu lassen.
Die Verbindung kommt nie zu stande, obwohl der Server ordentlich läuft ..

alzaimar 17. Jun 2007 14:02

Re: TClientSocket funktioniert nicht in einem Thread!?
 
Du kannst doch nicht 'Destroy' in der Execute-Methode aufrufen. Das dürfte einige Probleme verursachen...

Zacherl 17. Jun 2007 14:41

Re: TClientSocket funktioniert nicht in einem Thread!?
 
Nene DAS mache ich nicht :D Hab das Problem mittlerweile gelöst indem ich ClientType auf ctBlocking gesetzt habe. Jetzt wird allerdings das clientseitige OnRead Event nicht mehr ausgeführt :wall:

alzaimar 18. Jun 2007 07:48

Re: TClientSocket funktioniert nicht in einem Thread!?
 
Zitat:

Zitat von Florian Bernd
Nene DAS mache ich nicht :D Hab das Problem mittlerweile gelöst indem ich ClientType auf ctBlocking gesetzt habe. Jetzt wird allerdings das clientseitige OnRead Event nicht mehr ausgeführt :wall:

Ich meinte auch override.

override 28. Jun 2007 01:44

Re: TClientSocket funktioniert nicht in einem Thread!?
 
Zitat:

Zitat von alzaimar
Du kannst doch nicht 'Destroy' in der Execute-Methode aufrufen. Das dürfte einige Probleme verursachen...

Ja, doch erklärt es nicht das oben geschriebene Problem. (Die Destroy-Methode wird ja sowieso nach Execute() ausgeführt)
Ich bin jetzt aber auf direkte WinSock-Calls umgestiegen - was das Problem beseitigte.
Aber trotzdem vielen Dank für die Antworten. :D

Grüße

alzaimar 28. Jun 2007 07:00

Re: TClientSocket funktioniert nicht in einem Thread!?
 
Zitat:

Zitat von override
Zitat:

Zitat von alzaimar
Du kannst doch nicht 'Destroy' in der Execute-Methode aufrufen. Das dürfte einige Probleme verursachen...

Ja, doch erklärt es nicht das oben geschriebene Problem. (Die Destroy-Methode wird ja sowieso nach Execute() ausgeführt)

Aber nach Beendigung von Execute erwartet der TThread noch, das er instantiiert ist. ERgo: NIEMALS Destroy innerhalb der Execute-Methode (auch nicht am Ende) aufrufen. Verwende entweder 'FreeOnTerminate' oder zerstöre den Thread selbst.

override 29. Jun 2007 14:09

Re: TClientSocket funktioniert nicht in einem Thread!?
 
Zitat:

Zitat von alzaimar
Aber nach Beendigung von Execute erwartet der TThread noch, das er instantiiert ist. ERgo: NIEMALS Destroy innerhalb der Execute-Methode (auch nicht am Ende) aufrufen. Verwende entweder 'FreeOnTerminate' oder zerstöre den Thread selbst.

Werde ich tun, danke. :)
Ich weiß nicht wieso ich Destroy() dort plaziert hatte, war wohl nur aus "Testzwecken". oO


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 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