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; 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); timerThread.Interval := 30*60*1000; timerThread.TimerEvent := MyActionProc; timerThread.Resume; End; |
Im FormClose des Hauptformulars terminierst du den Thread.