Zitat von
Xong:
Nimm das, Schurke!
Delphi-Quellcode:
procedure Delay(Milliseconds: Cardinal);
var
Tick: Cardinal;
Event: THandle;
begin
Event := CreateEvent(nil, False, False, nil);
try
Tick := Milliseconds;
// Milliseconds wird missbraucht als Zwischenspeicher für GetTickcount
Milliseconds := GetTickcount;
Tick := Tick + Milliseconds;
while (Tick > Milliseconds) and
(MsgWaitForMultipleObjects(1, Event, False, Tick-Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
Application.ProcessMessages;
Milliseconds := GetTickcount;
end;
finally
CloseHandle(Event);
end;
end;
Vorteil: Es wird nur mit VZ-losen Werten gerechnet.
Achtung da versteckt sich ein gemeiner Bug!!!
Angenommen GetTickCount liefert $FFFFF00. Es soll 1000 ms gewartet werden.
Also ist der Zielwert = $FFFFF00 + 1000 = (Taschenrechner her!) $000002E8
Nun wird die Bedingung in der While-Schleife die nächsten ~ 49 Tage nicht mehr True werden.
Die Wahrscheinlichkeit ist gering, dass dieser Bug auftritt.
Falls aber doch hängt das Programm.