Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#28

Re: Problem mit Delay

  Alt 19. Feb 2008, 15:20
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.
Andreas
  Mit Zitat antworten Zitat