11 Stimmen

Wie kann man eine Delphi-Anwendung (die gerade läuft) dazu bringen, etwas zu einem bestimmten Zeitpunkt/Datum zu tun?

Meine Anwendung befindet sich in der Taskleiste, wenn sie nicht verwendet wird.

Der Benutzer kann Ereignisse so konfigurieren, dass sie nach einem bestimmten Zeitplan auftreten. So kann die Aufgabe beispielsweise montags bis freitags um 17 Uhr oder jeden Mittwoch um 15 Uhr oder am 16. eines jeden Monats um 10 Uhr ausgeführt werden.

Angenommen, mein Delphi-Programm läuft immer, es startet beim Hochfahren. Wie kann ich in Delphi das Auslösen dieser geplanten Ereignisse am besten unterstützen?

Offensichtlich kann ein TTimer verwendet werden, um Ereignisse auf der Grundlage der verstrichenen Zeit zu planen, aber sie scheinen für dieses Problem nicht geeignet zu sein.

Prost

0voto

skamradt Punkte 15128

Eine andere Möglichkeit wäre, einen TThread zu erstellen, der die Verwaltung des Timers übernimmt:

type
  TestThreadMsg = class(tThread)
  private
    fTargetDate : tDateTime;
    fMsg : Cardinal;
  protected
    procedure Execute; override;
    procedure NotifyApp;
  public
    constructor Create( TargetDate : TDateTime; Msg:Cardinal);
  end;

Umsetzung:

constructor TestThreadMsg.Create(TargetDate: TDateTime; Msg: Cardinal);
begin
  inherited Create(True);
  FreeOnTerminate := true;
  fTargetDate := TargetDate;
  fMsg := Msg;
  Suspended := false;
end;

procedure TestThreadMsg.Execute;
begin
  Repeat
    if Terminated then exit;
    if Now >= fTargetDate then
      begin
        Synchronize(NotifyApp);
        exit;
      end;
    Sleep(1000); // sleep for 1 second, resoultion = seconds
  Until false;
end;

procedure TestThreadMsg.NotifyApp;
begin
  SendMessage(Application.MainForm.Handle,fMsg,0,0);
end;

Diese können dann mit dem Hauptformular verbunden werden:

const
  WM_TestTime = WM_USER + 1;

TForm1 = Class(TForm)
  :
  procedure FormCreate(Sender: TObject);
  procedure WMTestTime(var Msg:tMessage); message WM_TestTime;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TestThreadMsg.Create(IncSecond(Now,5),WM_TestTime);
end;

procedure TForm1.WMTestTime(var Msg: tMessage);
begin
  ShowMessage('Event from Thread');
end;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X