Einzelnen Beitrag anzeigen

helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#11

Re: Nonblocking/Threadblocking?

  Alt 30. Okt 2009, 14:15
hi,

damals war ich dabei, einen webserver zu programmieren, den ich mittlerweile schon über vier Jahre lang einsetze
Zunächst startet man einen neuen Behandlungsthread durch

Delphi-Quellcode:
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
// [...]
  SocketThread := nil;
  SocketThread := TSendThread.Create(true,ClientSocket); // create susepended
  while not assigned(SocketThread) do Application.ProcessMessages;
  (SocketThread as TSendThread).MemoThread := form1.MyThread; // Callback-Information setzen
  (SocketThread as TSendThread).processline :=memo2.Lines.Count-1; // http-request
  (SocketThread as TSendThread).Resume; // threadausführung starten
end;
im Thread selbst kann man dann WinSocketStreams bearbeiten. Es muss allerdings, wie vielleicht schon aus der Klassenbezeichung zu vermuten, eine eigene Threadklasse abgeleitet werden:

Delphi-Quellcode:
type TSendThread= Class(TServerClientThread)
    Procedure ClientExecute; override;
    function SendFile(fn: string):boolean;
  public
    MemoThread: Cardinal;
    processline: integer;
    request: string;
    replyhdr: string;
    fn: string;
    fsize: longint;
    starttime: longint;
  end;
Der SocketStream hängt dann beim Schreiben nicht alles auf. Zu deiner Frage: Das Timing des Schreibens wird durch den SocketStream geregelt. Für Leseoperationen gilt afaik das gleiche, sprich du gibst eine Anzahl zu lesender bytes vor und einen timeout und der Thread fährt dann fort, wenn die Daten gelesen oder die Zeit abgelaufen ist. Ich bin mittlerweile nicht mehr so sehr in der Thematik drin, da ich in letzter Zeit vorwiegend im Bereich Signal- und Bildverarbeitung unterwegs bin. Vielleicht schreibt ja noch einer der Cracks hier was dazu
  Mit Zitat antworten Zitat