Einzelnen Beitrag anzeigen

WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#14

Re: ScheduledFuture in Delphi?

  Alt 17. Okt 2009, 21:16
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
  Mit Zitat antworten Zitat