Autor Beitrag
mehmeh
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97

WIN XP
D5 Prof
BeitragVerfasst: Di 20.09.05 14:49 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 20.09.05 14:59 
ausblenden 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

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.
ausblenden volle Höhe 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:
ausblenden 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.

_________________
Na denn, dann. Bis dann, denn.