delphi中關於定時執行的問題 |
答題得分者是:Brian77
|
zhuna
一般會員 發表:26 回覆:39 積分:13 註冊:2003-05-19 發送簡訊給我 |
|
Clarinet
高階會員 發表:9 回覆:97 積分:126 註冊:2002-05-08 發送簡訊給我 |
引言: 我現在有n個sql語句要按設定的時間間隔執行,起始時間是已設定好的. 如 sql1, 每隔4小時執行一次 sql2, 每隔3小時執行一次 sql3, 每隔5小時執行一次 sql4, 每隔2小時執行一次 . ........ . ........ . ........ 請問在delphi中如何實現? 互相幫助,共同進步用Timer元件,就能做到了! GPS(全球衛星定位系統) http://www.allgps.com
------
GPS(全球衛星定位系統) http://www.allgps.com |
zhuna
一般會員 發表:26 回覆:39 積分:13 註冊:2003-05-19 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹒ TTimer元件在System元件頁﹐其作用是可以每隔一段時間去呼叫一個事件﹐間隔時間可以自訂﹒其屬性如下﹕ Enable屬性﹕設定Timer元件是否有效﹐若有效時﹐即可在一定的時間內自動呼叫OnTimer事件
Interval屬性﹕設定OnTimer事件触發的間隔時間﹐其單位為千分之一秒﹐有范圍限定﹐0~65535﹐當Interval屬性為非0時才會去呼叫OnTimer事件﹐預設值為1000﹐即每秒触發一次OnTimer事件﹒ 如您的問題﹐即可利用Timer元件來完成﹐首先將其Enable屬性設定ture, 而后再在其Interval屬性中設定執行事件的時間﹐再將SQL寫入其OnTimer事件中﹐如果有多個SQL的話﹐那就多用幾個Timer元件來對應啦﹒當然這里還涉及到一個Interval屬性無法設定到幾小時那么長的間隔時間﹐所以﹐可以考慮一下在OnTime事件中用迴圈來做﹐直到Interval的值達到迴圈的數值﹐再執行其下的SQL﹒ 參考看看﹗ 努力,相信會獲得美麗!
忻晟 發表人 - cashxin2002 於 2003/08/07 15:59:16
------
忻晟 |
Brian77
中階會員 發表:8 回覆:114 積分:94 註冊:2002-05-17 發送簡訊給我 |
mSQL:array of String; // SQL 語句 mStep:array of integer; // 時間間隔 (以分為單位) mTime:array of integer; // 計時 (以分為單位) Timer1.Interval:=60000; // 一分鐘 每一組要設定 mSQL 和 mStep、mTime mTiem 的初值為 0 或與 mStep 相同 procedure TForm1.Timer1Timer: var i:integer; begin Timer1.Enabled:=False; try for i:=0 to Length(mSQL)-1 do begin dec(mTime[i]); if mTime[i]<=0 then begin mTime[i]:=mStep[i]; try 執行 mSQL[i]; except ... end; end; end; finally Timer1.Enabled:=True; end; end; |
Brian77
中階會員 發表:8 回覆:114 積分:94 註冊:2002-05-17 發送簡訊給我 |
引言: Interval屬性﹕設定OnTimer事件触發的間隔時間﹐其單位為千分之一秒﹐有范圍限定﹐0~65535﹐當Interval屬性為非0時才會去呼叫OnTimer事件﹐預設值為1000﹐即每秒触發一次OnTimer事件﹒ 發表人 - cashxin2002 於 2003/08/07 15:59:16Interval 型態為 Cardinal 即32位元正整數 online help 中並未提及最大值限制 做了項簡單測試, 設為兩分鐘 (120000) 可正常運作 另, 其值必須不可為 0 |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
這樣做會有一些問題
可能會造成有些工作會lost掉
因為當程式忙碌,而無法處理訊息時,Timer 是無法被觸發的
縱使在程式中加上了 Application.ProcessMessages 也可能會因為單一行程式執行時間過久 (如一條 SQL 或 Stored procedure 執行時間超過 Timer.Interval 的時間) 而造成 Timer 該觸發而未觸發的狀況 所以我建議工作執行緒要和主程式分開
可以設計一個 class,包含工作內容、時間間隔等屬性,以及一個計時方法。 每一項工作建立一個工作物件,主程式只有一個 Timer ,Interval 設定為 60000,當 OnTimer 事件發生時,逐一呼叫各工作物件的計時方法。
在工作物件的計時方法中去檢查是否到達時間間隔,如果到達,建立一個工作執行緒以執行工作。 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |