Ah okay diese Regel war mir bisher unbekannt
Also wäre die optimale Lösung wirklich sowas in der Art:
Delphi-Quellcode:
procedure TdxIDTPSendThread.Execute;
var
I, X, Y: Integer;
List: TList;
Transfer: TdxIDTPTransfer;
begin
while (not Terminated) do
begin
List := FWriter.TransferList.LockList;
try
X := 0;
Y := 0;
for I := 0 to List.Count - 1 do
begin
FWriter.TransferList.UnlockList;
try
// OnProgress
finally
List := FWriter.TransferList.LockList;
end;
// blabla ..
FWriter.TransferList.UnlockList;
try
// OnData
finally
List := FWriter.TransferList.LockList;
end;
if (not Transfer.Priority) then
begin
Inc(X);
end;
Inc(Y);
end;
// Beendete Transfers entfernen
for I := List.Count - 1 downto 0 do
begin
Transfer := TdxIDTPTransfer(List[I]);
if (Transfer.TransferState = tsFinished) then
begin
List.Delete(I);
Transfer.Free;
end;
end;
finally
FWriter.TransferList.UnlockList;
end;
Sleep(10);
// Thread suspendieren
if (Y = 0) then
begin
{$WARNINGS OFF}
Suspend;
{$WARNINGS ON}
end;
end;
end;
Edit: Wobei dann hätte ich halt wieder das Problem, dass von der
VCL aus Elemente in der Liste geändert oder sogar entfernt werden könnten. Ist der Thread dann noch in der Schleife und das letzte Element fehlt auf einmal, dann krachts ja wieder