Bzgl dieses Codes hier:
Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var
AlarmTimer : THandle;
Zeit : Large_Integer;
start, ende : Cardinal;
begin
Memo1.lines.add('SetWaitableTimer: 1 sec Running');
start:= GetTickCount;
AlarmTimer := CreateWaitableTimer(nil, False, nil);
CancelWaitableTimer(AlarmTimer); // goto Start
Zeit.QuadPart := 1 * (-10000000); // 1 Sekunde
SetWaitableTimer(AlarmTimer, Zeit.Quadpart, 0, nil, nil, False);
while WaitForSingleObject(AlarmTimer, 20) <> Wait_Object_0 do // Beispiel: 20msec
begin Application.ProcessMessages; end;
end1:= GetTickCount;
Memo1.lines.add(INTTOSTR(end1-start)+' msec');
Memo1.lines.add('WaitableTimer: Ready');
end;
Wie lasse ich den Sleep denn 500ms warten?
Verstehe den irgendwie nicht so richtig.
Der folgende wäre mir deutlich lieber aber auf meine boolsche Prüfung reagiert er gar nicht! Caption := 'X'; wird auch nie ausgeführt wenn das drin steht.
Delphi-Quellcode:
procedure TForm1.LongDelay(Milliseconds: Integer);
var
Tick: DWord;
Event: THandle;
begin
Event := CreateEvent(nil, False, False, nil);
try
Tick := GetTickCount + DWord(Milliseconds);
while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
if not bTimerRunning then
Exit;
Milliseconds := Tick - GetTickCount;
end;
finally
CloseHandle(Event);
end;
end;