AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TClientSocket funktioniert nicht in einem Thread!?
Thema durchsuchen
Ansicht
Themen-Optionen

TClientSocket funktioniert nicht in einem Thread!?

Offene Frage von "Zacherl"
Ein Thema von override · begonnen am 18. Mär 2007 · letzter Beitrag vom 29. Jun 2007
Antwort Antwort
override

Registriert seit: 16. Dez 2006
10 Beiträge
 
Delphi 2005 Personal
 
#1

TClientSocket funktioniert nicht in einem Thread!?

  Alt 18. Mär 2007, 17:12
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]
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: TClientSocket funktioniert nicht in einem Thread!?

  Alt 17. Jun 2007, 13:36
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 ..
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: TClientSocket funktioniert nicht in einem Thread!?

  Alt 17. Jun 2007, 14:02
Du kannst doch nicht 'Destroy' in der Execute-Methode aufrufen. Das dürfte einige Probleme verursachen...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: TClientSocket funktioniert nicht in einem Thread!?

  Alt 17. Jun 2007, 14:41
Nene DAS mache ich nicht Hab das Problem mittlerweile gelöst indem ich ClientType auf ctBlocking gesetzt habe. Jetzt wird allerdings das clientseitige OnRead Event nicht mehr ausgeführt
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: TClientSocket funktioniert nicht in einem Thread!?

  Alt 18. Jun 2007, 07:48
Zitat von Florian Bernd:
Nene DAS mache ich nicht Hab das Problem mittlerweile gelöst indem ich ClientType auf ctBlocking gesetzt habe. Jetzt wird allerdings das clientseitige OnRead Event nicht mehr ausgeführt
Ich meinte auch override.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
override

Registriert seit: 16. Dez 2006
10 Beiträge
 
Delphi 2005 Personal
 
#6

Re: TClientSocket funktioniert nicht in einem Thread!?

  Alt 28. Jun 2007, 01:44
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.

Grüße
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: TClientSocket funktioniert nicht in einem Thread!?

  Alt 28. Jun 2007, 07:00
Zitat von override:
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
override

Registriert seit: 16. Dez 2006
10 Beiträge
 
Delphi 2005 Personal
 
#8

Re: TClientSocket funktioniert nicht in einem Thread!?

  Alt 29. Jun 2007, 14:09
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
  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 14:20 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