Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

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

Anfängerfrage: Non Blocking TCP Client in einem Thread

  Alt 4. Dez 2009, 15:40
Moin

Jahaaa, auch Moderatoren sind manchmal richtige Deppen. So wie ich.

Ich muss eine Anwendung fertigstellen, in der ein Thread mit einem TCP-Server kommuniziert. Ich möchte diese Änderungen minimalinvasiv gestalten, d.h. vorhandene Klassen nur austauschen und ganz wenig am Code verändern.

Folgender Code bereitet mir Bauchschmerzen:

Hier der Code des Kommunikationsthreads:
Delphi-Quellcode:
Type
  TComThread = Class (TThread)
  Private
     fSocket : TClientSocket;
  ...
  Public
     Procedure SendData (Const Data : String);
     Property OnDataReceived : TDataReceivedEvent...;
  End;

Procedure TComThread.SendData (Const Data : String);
Begin
  AddDataToOutputQueue(Data)
End;

Procedue TComThread.Execute;
  Procedure WaitForSocketConnected;
  Begin
    Repeat until Timeout or fSocketConnected;
  End;

Begin
  fSocket := TClientSocket.Create(nil);
  fSocket.ClientType := ctNonBlocking;
  fSocket.OnConnected := SocketConnected;
  fSocket.OnRead := ReadDataFromSocket;
  ...
  fSocket.Connect;
  Synchronize (WaitForSocketConnected); // <--- hä? klappt aber nur so

  While not Terminated And fSocketconnected Do
    If DataToSendAvailable Then SendNextChunkOfData;

  fSocket.Free;
End;
Der Thread verwaltet eine Queue, in der andere Threads ihre Daten reinpacken, die verschickt werden sollen.
Der Thread hat einen Event, der gefeuert wird, wenn Daten angekommen sind.

Das Teil hängt sich manchmal auf und ich vermute, das das an diesem komischen Synchronize liegt. Außerdem ist das irgendwie uncool.

Meine Frage lautet nun:
Wie macht man das richtig?
Wie verwendet man einen Non-Blocking Socket in einem Thread? Gibt es irgendwo Codebeispiele?

Oder gibt es bessere/einfachere Lösungen?

Wie gesagt, wichtig ist mir nur das Interface des Threads (SendData, OnDataReceived) und das das Senddata den Aufrufer nicht blockiert.

Da ich bestimmt den Wald vor lauter Bäumen nicht sehe, bin ich gerne bereit, mich auslachen zu lassen.
Oder mit Torten beschmeißen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat