定時器app |
Timer1函數 |
Timer_workspa |
Interval線程 |
1000code |
1500orm |
Enabledblog |
True事件 |
Trueci |
Ontimer事件it |
if Timer1.Tag=1 then exit; //tag=1表示正在忙 Timer1.Tag := 1; try memo1.Lines.Add(formatDatetime('NN:SS',now)+'Timer_work.tag=' + intToStr(Timer_work.tag)); finally Timer1.Tag := 0; end;
|
if Timer_work.Tag=1 then exit; //tag=1表示正在忙 Timer_work.Tag := 1; try memo1.Lines.Add(formatDatetime('NN:SS',now)+'Timer1.tag=' + intToStr(Timer1.tag)); finally Timer_work.Tag := 0; end;
|
39:15Timer_work.tag=0 39:16Timer1.tag=0 39:16Timer_work.tag=0 39:17Timer1.tag=0 39:17Timer_work.tag=0 39:19Timer_work.tag=0 39:19Timer1.tag=0 39:20Timer_work.tag=0 39:20Timer1.tag=0 39:21Timer_work.tag=0 39:22Timer_work.tag=0 39:22Timer1.tag=0 39:23Timer_work.tag=0 39:24Timer1.tag=0 39:24Timer_work.tag=0 39:25Timer_work.tag=0 39:25Timer1.tag=0 39:26Timer_work.tag=0 39:27Timer1.tag=0 39:27Timer_work.tag=0 39:28Timer_work.tag=0 39:28Timer1.tag=0 39:29Timer_work.tag=0 39:30Timer1.tag=0 39:30Timer_work.tag=0 39:31Timer_work.tag=0 39:31Timer1.tag=0 39:32Timer_work.tag=0 39:33Timer1.tag=0 39:33Timer_work.tag=0
以上爲運行一段時間後memo1中的結果。其中:
Timer_work.tag=0出現的次數爲17次
Timer1.tag=0出現的次數爲12次
17/12約等於18/12=3:2=1.5:1
結果分析以下:
1,各個定時器均處於主線程中,多是串行工做機制。即在Timer1的OnTimer事件中,Timer_work的OnTimer事件已經執行完畢,反之亦然,不會2個定時器事件同時處於執行狀態。
2,2個定時器事件的執行次數比與定時器週期基本成反比。符合預期。
定時器 |
Timer1 |
Timer_work |
Interval |
1000 |
1500 |
Enabled |
True |
True |
Ontimer事件 |
if Timer1.Tag=1 then exit; //tag=1表示正在忙 Timer1.Tag := 1; try application.ProcessMessages; sleep(1000); memo1.Lines.Add(formatDatetime('NN:SS',now)+'Timer_work.tag=' + intToStr(Timer_work.tag)); finally Timer1.Tag := 0; end;
|
if Timer_work.Tag=1 then exit; //tag=1表示正在忙 Timer_work.Tag := 1; try application.ProcessMessages; sleep(1000); memo1.Lines.Add(formatDatetime('NN:SS',now)+'Timer1.tag=' + intToStr(Timer1.tag)); finally Timer_work.Tag := 0; end;
|
02:33Timer_work.tag=0 02:34Timer1.tag=0 02:35Timer_work.tag=0 02:36Timer_work.tag=1 02:37Timer_work.tag=1 02:38Timer_work.tag=1 02:39Timer_work.tag=1 02:40Timer_work.tag=1 02:41Timer_work.tag=1 02:42Timer_work.tag=1 02:43Timer_work.tag=1 02:44Timer_work.tag=1 02:45Timer_work.tag=1 02:46Timer_work.tag=1 02:47Timer_work.tag=1 02:48Timer_work.tag=1 02:49Timer_work.tag=1 02:50Timer_work.tag=1 02:51Timer_work.tag=1 02:52Timer_work.tag=1 02:53Timer_work.tag=1 02:54Timer_work.tag=1 02:55Timer_work.tag=1 02:56Timer_work.tag=1 02:57Timer_work.tag=1 02:58Timer_work.tag=1 02:59Timer_work.tag=1 03:00Timer_work.tag=1 03:01Timer_work.tag=1
以上爲運行一段時間後memo1中的結果。其中:
在Timer1的OnTimer事件中,出現了Timer_work.tag=1。這說明2個定時器事件同時處於執行狀態。
以上事件出現後,就一直維持每一秒輸出一次Timer_work.tag=1,說明程序一直在執行Timer1的OnTimer事件,而Timer_work的OnTimer事件被抑制。
結果分析以下:
1,各個定時器均處於主線程中,多是串行工做機制。但並不意味着「在Timer1的OnTimer事件中,Timer_work的OnTimer事件已經執行完畢」,可能從一個定時器事件中跳出去執行另外一個計時器事件,也就是說2個定時器事件可能同時處於事件響應過程當中,但同一時間只有1個事件正在執行。
2,自己只准備睡眠1秒的Timer_work.,通過了25秒仍未恢復執行。而timer1調用週期爲1秒加上sleep 1秒,應該是每2秒輸出1次「Timer_work.tag=1」,但實際輸出間隔是1秒,不符合預期。
定時器 |
Timer1 |
Timer_work |
Interval |
1000 |
1500 |
Enabled |
True |
True |
Ontimer事件 |
if Timer1.Tag=1 then exit; //tag=1表示正在忙 Timer1.Tag := 1; try application.ProcessMessages; memo1.Lines.Add(formatDatetime('NN:SS',now)+' in Timer1Timer before sleep' ); sleep(1000); memo1.Lines.Add(formatDatetime('NN:SS',now)+'Timer_work.tag=' + intToStr(Timer_work.tag)); finally Timer1.Tag := 0; memo1.Lines.Add(formatDatetime('NN:SS',now)+'Timer1.tag=' + intToStr(Timer1.tag)); end;
|
if Timer_work.Tag=1 then exit; //tag=1表示正在忙 Timer_work.Tag := 1; try application.ProcessMessages; sleep(1000);
|
中止按鈕的響應事件:
procedure TForm1.Button1Click(Sender: TObject); begin memo1.Lines.Add(formatDatetime('NN:SS',now)+' 中止按鈕已按下..' ); Timer_work.Enabled := False; Timer1.Enabled := False; memo1.Lines.Add(formatDatetime('NN:SS',now)+' 計時器已中止.' ); end;
48:19 in Timer1Timer before sleep 48:20Timer_work.tag=1 48:20Timer1.tag=0 48:20 in Timer1Timer before sleep 48:21Timer_work.tag=1 48:21Timer1.tag=0 48:21 in Timer1Timer before sleep 48:22Timer_work.tag=1 48:22Timer1.tag=0 48:22 in Timer1Timer before sleep 48:23Timer_work.tag=1 48:23Timer1.tag=0 48:23 in Timer1Timer before sleep 48:24Timer_work.tag=1 48:24Timer1.tag=0 48:24 in Timer1Timer before sleep 48:25Timer_work.tag=1 48:25Timer1.tag=0 48:25 in Timer1Timer before sleep 48:26Timer_work.tag=1 48:26Timer1.tag=0 48:26 in Timer1Timer before sleep 48:27Timer_work.tag=1 48:27Timer1.tag=0 48:27 in Timer1Timer before sleep 48:28Timer_work.tag=1 48:28Timer1.tag=0 48:28 in Timer1Timer before sleep 48:29Timer_work.tag=1 48:29Timer1.tag=0 48:29 in Timer1Timer before sleep 48:30Timer_work.tag=1 48:30Timer1.tag=0 48:30 中止按鈕已按下.. 48:30 計時器已中止. 48:31Timer1.tag=0 48:31Timer_work.tag=0
以上爲運行一段時間後memo1中的結果。其中:
在Timer1的OnTimer事件中,sleep先後相差1秒,說明時間主要被sleep函數消耗,而不是被timer的週期消耗。
Timer_work.tag=0一直到中止該計時器時纔出現。
結果分析以下:
1,timer控件的週期只是調用執行的時間間隔,實際執行時間需考慮多種因素。假設timer週期爲T1,timer事件響應函數執行時間爲T2,那麼實際執行週期爲max(T1,T2),而不是T1+T2。
2,多計時器同時啓用時,可能出現沒法想象的結果。應避免使用application.ProcessMessages和sleep的同時調用。
實驗證實,如下情景可能出現問題:
結論: