Zitat von
Neutral General:
Delphi-Quellcode:
..
Synchronize(FClient.ReceiveData); //<=========
end;
finally
CS.Leave; //<=========
end;
Unter der Vorraussetzung das ReceiveData auch per CS.Enter zugreifen will (z.B. auf FBuffer) ist das ein klassischer Deadlock, da der Thread die CS noch hält.
Wenn der MainThread nur auf die in FBuffer bereitgestellten Daten zurückgreift muss auch nur der Zugriff auf FBuffer synchronisiert werden, das schafft mehr Atempausen in denen die einzelnen Threads frei arbeiten können:
Delphi-Quellcode:
..
if not FClient.FTCPClient.Connected then continue;
if not FClient.FTCPClient.Socket.InputBufferIsEmpty then
begin
FClient.FTCPClient.Socket.ReadBytes(Buff,FClient.FTCPClient.Socket.InputBuffer.Size);
CS.Enter;
try
FClient.FBuffer.Write(Buff[0],Length(Buff));
finally
CS.Leave;
end;
Synchronize(FClient.ReceiveData);
end;
..
Grüsse, Dirk