OK, wenn das Event drinnenbleiben soll und man keine zusätzliche Schleife möchte, dann halt das Event nur zurücksetzen, wenn nichts mehr in der Liste steht.
Delphi-Quellcode:
function TDataClass.ExtractFirst: POneData;
begin
Lock;
try
if Assigned(FFirst) then
begin
Result := FFirst;
FFirst := FFirst^._Next;
if not Assigned(FFirst) then
ResetEvent(FEvent);
end else Result := nil;
finally
Unlock;
end;
end;