Entwickler-Ecke

Windows API - alle 30 min soll das Prog etwas machen/ Schleife


mehmeh - Di 20.09.05 14:49
Titel: alle 30 min soll das Prog etwas machen/ Schleife
Hallo alle zusammen,
ich möchte das mein Programm immer nach einer bestimmten Zeit nach einer Datei sucht und wenn es sie gefunden hat, die Daten verarbeitet.

Bisher mache ich das mit einen Timer, aber den finde ich nicht so günstig, d.h. ich will irgendwo festlegen, dass das Prog alle 30 min nachschaut und weiter verfährt.
Eine Art schleife!
Gibt es eine Möglichkeit das zu machen ohne den Timer zu verwenden?

Ich hoffe es ist verständlich.

Danke


uall@ogc - Di 20.09.05 14:59


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function schleife(a: integer): integer;
begin
  result := 0;
  while true {bedingung bis ende} do
  begin
    //mach was
    sleep(60*1000*30); //30 minuten warten
  end;
end;


var tid: cardinal;
BeginThread(nil,0,@schleife,nil,0,tid);


ungetestet


alzaimar - Di 20.09.05 15:04

Was ist so falsch an einem Timer?
Alternative: Benutze einen Thread, den Du mit Sleep schlafen legst, z.B. für jeweils 1 minute oder sekunde, egal.
Wenn er aufwacht, schaut er nach, ob die Zeit schon rum ist. Wenn nicht, geht er wieder schlafen. Wenn ja, macht er was (feuert einen Event, z.B.) setzt den Zähler wieder zurück und geht wieder pennen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
Type
  TTimerThread = Class (TThread)
  Private
    fSleepInterval,
    fInterval : Integer;
    fEvent : TNotifyEvent;
    Procedure DoFireEvent;
  Protected
    Procedure Execute; Override;
  Public
    Constructor Create (aSleepInterval : Integer);
    Property Interval : Integer Read fInterval Write SetInterval;
    Property TimerEvent : TNotifyEvent Read fEvent Write fEvent;
  End;

Constructor TTimerThread.Create (aSleepInterval : Integer);
Begin
  inherited Create (True);
  fSleepInterval := aSleepInterval;
  fInterval :=  300000// irgend einen Anfangswert, hier 30 sec
End;

Procedure TTimerThread.DoFireEvent;
Begin
  If assigned (fEvent) Then fEvent (Self)
End;

Procedure TTimerThread.Execute;
Var
  iWaiting : Integer;

Begin
  iWaiting := 0;
  While not Terminated do Begin
    Sleep (fSleepInterval);
    inc (iWaiting, fSleepInterval);
    If iWaiting>=fSleepInterval Then Begin
      Synchronize (DoFireEvent);
      iWaiting := 0;
    End;
  End;
End;


Erst erzeugst Du den Thread, legst das Interval fest, biegst den Event um und weckst ihn dann per Resume auf:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Var
  timerThread : TTimerThread;

Begin
  timerThread := TTimerThread.Create (1000); // 1x pro Sekunde nachschauen
  timerThread.Interval := 30*60*1000// Alle 30 min was machen
  timerThread.TimerEvent := MyActionProc; // und zwar das hier
  timerThread.Resume;
End;


Im FormClose des Hauptformulars terminierst du den Thread.