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.