Also die Terminierung des Threads sollte soweit funktionieren (hat sie auch in meinen Tests
).
Ich habe auch nicht gesagt, dass das nicht funktioniert, es gibt aber ein ganz schmales Zeitfenster, wo das nicht funktioniert.
Das doofe daran ist, wenn man es gar nicht gebrauchen kann, dann schlägt das zu (Murphy)
Hier mal mein Vorschlag für den Händler:
Delphi-Quellcode:
TIOHandler = class
private
FSendQueue, FWaitQueue : TQueue<TdxIDTPOTransfer>;
...
protected
...
procedure SendDataPacket;
...
end;
TIOHandler.SendDataPacket;
var
Transfer : TdxIDTPOTransfer;
begin
{ CRITICAL-SECTION START }
// Aus der Queue entnehmen
Transfer := FSendQueue.Dequeue;
{ CRITICAL-SECTION ENDE }
// Senden
Transfer.SendNextPacketData;
// Diesen Teil würde ich auch in eine eigene Methode packen, da diese auch aufgerufen werden sollte,
// wenn eine neue Transfer-Instanz hinzukommt
{ CRITICAL-SECTION START }
// Mal schauen, was mit der Instanz weiter passieren soll
if
( Transfer.TransferState = tsActive {?} )
and
( Transfer.Priority or ( FSendQueue.Count < OutgoingTransferCountLimit ) )
then
FSendQueue.Enqueue( Transfer )
else
if
( Transfer.TransferState <> tsFinished )
then
FWaitQueue.Enqueue( Transfer )
else
Transfer.Free;
while ( FSendQueue.Count < OutgoingTransferCountLimit ) and ( FWaitQueue.Count > 0 ) do
FSendQueue.Enqueue( FWaitQueue.Dequeue );
if ( FSendQueue.Count = 0 ) then // hier noch die Abfrage rein, ob der Thread nicht eigentlich beendet werden soll
ResetEvent( SendThread.WaitEvent )
else
SetEvent( SendThread.WaitEvent );
{ CRITICAL-SECTION ENDE }
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)