Zitat von
Apollonius:
Es gibt keinen Grund, einen Zeiger auf das Timer-
Handle in TDescriptor zu speichern. Nimm das
Handle selbst.
Der letzte Parameter von DeleteTimerQueueTimer sollte wahrscheinlich 0 sein, INVALID_HANDLE_VALUE blockiert. Auf der anderen Seite weiß ich nicht, ob man aus dem Callback überhaupt seinen eigenen Timer löschen kann.
Das hab ich mir auch schon gedacht, ich weiß nur nicht wann ich es sonst machen soll
Delphi-Quellcode:
procedure OnTimer(Context: Pointer; Success: Boolean);
stdcall;
begin
PDescriptor(Context)^.Proc;
try
if not DeleteTimerQueueTimer(PDescriptor(Context)^.Queue, PDescriptor(Context)^.Timer, 0)
then
raise Exception.Create('
Deleting a timer failed!');
finally
Dispose(Context);
end;
end;
procedure TScheduler.AddSchedule(Milliseconds: Cardinal; Proc: TSchedule);
var
Timer: THandle;
PDesc: PDescriptor;
begin
New(PDesc);
PDesc^.Proc := Proc;
PDesc^.Queue := FQueue;
if not CreateTimerQueueTimer(Timer, FQueue, OnTimer, PDesc, Milliseconds, 0, WT_EXECUTEONLYONCE)
then
raise Exception.Create('
Creating a timer failed!');
PDesc^.Timer := Timer;
end;
"Deleting a timer failed!" tritt auf.