Zitat:
Ich kenne mich leider mit den Interna von den neuen Routinenreferenzen nicht aus
Hatte das eh nur aus Gemütlichkeit gemacht, wollte es dann in procedure of object umwandeln.
Hab es jetzt so:
Delphi-Quellcode:
unit Scheduler;
interface
uses Windows, SysUtils;
type
TSchedule =
procedure of object;
TDescriptor =
record
Proc: TSchedule;
Queue: THandle;
Timer: PHandle;
end;
PDescriptor = ^TDescriptor;
TScheduler =
class
private
FQueue: THandle;
public
constructor Create;
destructor Destroy;
override;
procedure AddSchedule(Milliseconds: Cardinal; Proc: TSchedule);
end;
implementation
{ TScheduler }
constructor TScheduler.Create;
begin
FQueue := CreateTimerQueue;
end;
destructor TScheduler.Destroy;
begin
DeleteTimerQueue(FQueue);
inherited;
end;
procedure OnTimer(Context: Pointer; Success: Boolean);
stdcall;
begin
PDescriptor(Context)^.Proc;
DeleteTimerQueueTimer(PDescriptor(Context)^.Queue, Cardinal(PDescriptor(Context)^.Timer^), INVALID_HANDLE_VALUE);
Dispose(Context);
end;
procedure TScheduler.AddSchedule(Milliseconds: Cardinal; Proc: TSchedule);
var
Timer: THandle;
PDesc: PDescriptor;
begin
New(PDesc);
PDesc^.Proc := Proc;
PDesc^.Queue := FQueue;
PDesc^.Timer := @Timer;
if not CreateTimerQueueTimer(Timer, FQueue, OnTimer, PDesc, Milliseconds, 0, WT_EXECUTEONLYONCE)
then
raise Exception.Create('
Creating a timer failed!');
end;
end.
Die Funktion des Schedulers an sich funktioniert jetzt, die Message erscheint. Allerdings wollte ich danach gerne auch aufräumen und DeleteTimerQueueTimer aufrufen, dafür brauche ich aber ein paar Parameter die ich irgendwie noch da rein kriegen musste
Und da geht wohl was schief, ich hab's mit Pointern nicht so besonders