![]() |
To Block or not to Block. Frei nach WS
Hallo Zusammen!
Ich arbeite hin und wieder mit der TSock Unit von Ward van Wanrooij. Hier steht im Header, dass für einen Server Blocking das richtige wäre... Zitat:
Warum soll ich auf meinem Server pro Socket einen Thread mit Endlosschleife laufen lassen, wenn im non-Blocking bereich einfach gewartet werden kann, bis der event feuert? Oder habe ich da etwas falsch verstanden. Frank :gruebel: |
Re: To Block or not to Block. Frei nach WS
Push! Keiner ne Antwort oder Meinung?
Frank |
Re: To Block or not to Block. Frei nach WS
Hallo Frank,
Zitat:
Grüße vom marabu |
Re: To Block or not to Block. Frei nach WS
Ja eben...bzw. nein :stupid:
Blocking Der Server startet für jede Verbindung einen eigenen Thread der in einer Endlosschleife wartet...
Delphi-Quellcode:
Nonblocking
while NewSock.Connected do
try Sleep(100); Command:=NewSock.ReceiveLine(); //ReceiveLine returns when: // BlockingTimeout expires (return value=''), or // data has been received, but no full line (return value=''), or // data has been received, full line (return value=full line) if Command<>'' then begin LogBox.Items.Insert(0, 'Receive: '+Command); if (UpperCase(Command)='DATE') then NewSock.SendLine(DateTimeToStr(Now)) else if (UpperCase(Command)='QUIT') then NewSock.Close else NewSock.SendLine('Unknown or no command received. Valid commands are: DATE , QUIT'); end; except on E:ESockException do LogBox.Items.Insert(0, 'Exception: '+E.Message); end; Der Server kann sich mit sich selber beschäftigen, bis der entsprechende event diese Procedure aufruft.
Delphi-Quellcode:
procedure TMainForm.MasterSockRead(Sender: TObject; Count: Integer);
var Command: String; NewSock: TSock; begin NewSock:=(Sender as TSock); try Command:=NewSock.ReceiveLine; if (Length(Command)>0) then begin LogBox.Items.Insert(0, 'Receive: '+Command); if (UpperCase(Command)='DATE') then NewSock.SendLine(DateTimeToStr(Now)) else if (UpperCase(Command)='QUIT') then NewSock.Close else NewSock.SendLine('Unknown command. Valid commands are: DATE , QUIT'); end; except on E:ESockException do LogBox.Items.Insert(0, 'Exception: '+E.Message); end; end; Frank :coder: (Aus den Beispielprogrammen) |
Re: To Block or not to Block. Frei nach WS
Hallo Frank,
Zitat:
Ich habe mir die Unit TSock besorgt und mir den Code kurz angesehen. Ich komme zu dem Schluß, dass es sich um eine Implementierung von asynchronous sockets handelt. Dabei sendet der protocol stack eine message (WM_SOCK), wenn sich was tut. Die bloße Warnung vor dem non-blocking mode in TSock ist vielleicht etwas ungeschickt, aber der Autor wollte wohl nicht zu sehr ins Detail gehen. Nach meinen Informationen bricht die server performance mit asynchronous sockets recht bald ein. Während ich hier schreibe habe ich im Netz einen wunderschönen Artikel von ![]() Schönes Wochenende marabu |
Re: To Block or not to Block. Frei nach WS
Ja Danke!
Werde es gleich mal lesen... Danke |
Re: To Block or not to Block. Frei nach WS
Hi!
Netter Text, sagt im Prinzip alles... Das Problem ist jetzt eine Komponetet zu finden die eine asynchronen Threadgetriebenen Transfer für den Server hinkriegt. Und dann noch eine Event gesteuerte Client Komponente. Scheint schwieriger zu sein... :cry: Teste gerade die 4. :pale: Grüsse Frank :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 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