Zu deinem Thread.Execute:
IMHO machst du da zuviel Gedöns in dem Thread, was da nicht hingehört.
Der IOHandler hat alle Informationen, wie was wo gesendet werden soll, allerdings nicht direkt wann, das kommt ja im Thread.
Also würde ich den Thread auf seine wesentlichen Sachen reduzieren und dann sieht das wie folgt aus
Delphi-Quellcode:
procedure TdxIDTPSendThread.Execute;
begin
while not Terminated do
begin
WaitForSingleObject( FWaitEvent, INFINITE );
if not Terminated then
FIOHandler.SendDataPacket;
end;
end;
Allerdings würde ich den IOHandler nicht an den Thread hängen, sondern den Thread an den IOHandler. Dann gibt es auch kein Gerangel wer den Thread beenden kann (wird ja auch über das FWaitEvent gesteuert).
Es könnte passieren, dass trotz Terminate der Thread nicht aufhört, weil direkt nach dem Terminate der Thread selber das FWaitEvent zurücksetzt