Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TClientsocket soll warten in Thread (https://www.delphipraxis.net/143658-tclientsocket-soll-warten-thread.html)

aikombo 20. Nov 2009 13:47


TClientsocket soll warten in Thread
 
Hallo,

ich habe hier ein TClientsocket in einem Thread und es werden diverse
Daten an einen Server gesendet(über HTTP Protokoll).
Das Programm läuft so ab:
-Verbinden zum Server
-Anfrage senden
-auf Antwort warten
-Falls eine Antwort vom Server gekommen ist, soll der Client 30 Sekunden
warten bis er erneut etwas sendet.


Löse ich das mit sleep(30000); wird die Verbindung unterbrochen.

Gibts es irgendwelche Alternativen? habe leider nichts passendes gefunden.


Vielen Dank

uoeb7gp 20. Nov 2009 14:08

Re: TClientsocket soll warten in Thread
 
Hallo, wie hast Du die Komponente konfiguriert (Blocking, NonBlocking)??
Was meinst Du mit ClientSocket in einem Thread, da gibt es viele Möglichkeiten.

Kannst Du den Source posten?

lg.

aikombo 20. Nov 2009 14:26

Re: TClientsocket soll warten in Thread
 
Ich habe einfach eine Prozedur gemacht, die dann als neue Thread erstellt wird,
wenn du verstehst.

So fange ich dann die Ereignisse ab:
Delphi-Quellcode:
  repeat
    Sleep(50);
    Application.ProcessMessages;
  until (cs.Socket.Connected = true) or (Application.Terminated);
Clienttype ist ctNonBlocking

stho 20. Nov 2009 14:30

Re: TClientsocket soll warten in Thread
 
ich sag mal das "sleep" die falsche möglichkeit ist...
sleep müsste meines wissens das gesammte programm anhalten/einfrieren... :gruebel:


EDIT:
Vielleicht nimmst du die aktuelle zeit, speicherst sie in einer variablen und überprüfst mittels timer ob die gespeicherte zeit - aktuelle zeit >= 30 sec ist ^^

aikombo 20. Nov 2009 14:31

Re: TClientsocket soll warten in Thread
 
Zitat:

Zitat von stho
ich sag mal das "sleep" die falsche möglichkeit ist...
sleep müsste meines wissens das gesammte programm anhalten/einfrieren... :gruebel:

Ganz genau, deshalb frage ich nach einer Alternative :)

stho 20. Nov 2009 14:32

Re: TClientsocket soll warten in Thread
 
siehe meinen nachtrag :-)
Hab ihn gerade hinzugefügt als du deine antwort verfasst hast

uoeb7gp 20. Nov 2009 14:52

Re: TClientsocket soll warten in Thread
 
Ok, die Komponente ist auf ctNonBlocking gestellt, dadurch kommt ein
Asynchronen Client Socket zur Anwendung.

Dieser Client Socket wird somit durch Windows Messages mit Events versorgt.
Da brauchst Du nichts mehr selber zu implementieren, macht alles die "Black Box".

Also einfach einen Timer verwenden, und periodisch alle 30 sec ein send durchführen.

Sieh dir mal das mit Delphi mitgelieferte Chat Demo an.

lg.

aikombo 20. Nov 2009 14:59

Re: TClientsocket soll warten in Thread
 
Das Problem mit dem Timer ist aber, dass ich den ja irgendwie in dieser
Prozedur erstellen muss und wie komm ich dann an das event, wenn der Timer seine
30Sekunden erreicht hat?

uoeb7gp 20. Nov 2009 15:03

Re: TClientsocket soll warten in Thread
 
Ok, bitte nicht bös sein, aber Du verstehst die Arbeitsweise der Komponete nicht richtig.
Es ist wirklich notwendig dass Du dir zuvor das Teil mal genauer (Demo Chat) ansiehst.
Dann wird einiges leichter verständlich werden.

lg.

stho 20. Nov 2009 15:12

Re: TClientsocket soll warten in Thread
 
klar kannst du deinen timer zur lautzeit erstellen ^^
und nach dem erstellen sagst du einfach:


Delphi-Quellcode:
TimerName.onTimer := EreignissName;
Delphi-Quellcode:
procedure TForm1.EreicgnissName(Sender: TObject);
begin
  //XYZ
end;
Das weist dem TimerEreigniss einfach die passende procedure zu ^^

shmia 20. Nov 2009 16:04

Re: TClientsocket soll warten in Thread
 
Versuch' mal statt einem Sleep:
Delphi-Quellcode:
WaitForSingleObject(self.Handle {handle of object to wait for},
    30000  {time-out interval in milliseconds }  );
Gegebenfalls musst du noch das Result von WaitForSingleObject auswerten und mit WAIT_TIMEOUT vergleichen.

Schwedenbitter 25. Nov 2009 08:59

Re: TClientsocket soll warten in Thread
 
Zitat:

Zitat von shmia
Versuch' mal statt einem Sleep: ...

oder auch so (edit: OHNE THREAD):
Delphi-Quellcode:
Procedure Delay(Zeit: DWord);
Var
   Start         : DWord;
Begin
   Start:=GetTickCount;
   While (GetTickCount - Start) <= Zeit Do
      Application.ProcessMessages;
End;
So mache ich das.

Gruß, Alex

sirius 25. Nov 2009 09:24

Re: TClientsocket soll warten in Thread
 
Hast du tatsächlich die Client-Komponente in einem Thread? Wenn ja, dann wird es etwas aufwendiger als bisher beschrieben, ansonsten mache das, was uoeb7gp gesagt hat.

shmia 25. Nov 2009 13:20

Re: TClientsocket soll warten in Thread
 
Application.ProcessMessages aus einem Thread heraus - das geht ja mal gar nicht.
Dann werden nämlich Windows-Botschaften aus dem Hautpthread und dem Nebenthread bearbeitet => das verträgt die VCL nicht!

Schwedenbitter 25. Nov 2009 13:49

Re: TClientsocket soll warten in Thread
 
Ich hatte bei meiner Antwort den Titel des Themas nicht beachtet.
Ich ging bei der Antwort deshalb davon aus, dass es einfach nur um ein "Warten" ging. Ich habe daher meine Antwort etwas modifiziert!

Gruß, Alex


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