全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1893
推到 Plurk!
推到 Facebook!

請教ONTIME事件的設定

尚未結案
shiungyi
一般會員


發表:14
回覆:33
積分:9
註冊:2003-05-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-16 17:55:11 IP:163.29.xxx.xxx 未訂閱
請問 小弟目前撰寫一支程式 必須每整點讀檔一次 然後UPDATE回DATABASE 可是TIMER的INTERVAL所允許的時間長度不夠 請問該如何設定,方能使程式每整點執行一次 PS.小弟是第一次寫DELPHI程式,工具為DELPHI4,之前有試過 以WINDOW排程來設定,但因其最快也只能每日一次,不符需求 希望各位高手能指點迷津 謝謝
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-16 18:16:33 IP:140.135.xxx.xxx 未訂閱
shiungyi您好:    
引言: 可是TIMER的INTERVAL所允許的時間長度不夠 請問該如何設定,方能使程式每整點執行一次
剛剛太匆忙,沒有考慮太多,對不起...< > 偵測現在時間這方式應該可行... 順心< > ~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 - taishyang 於 2003/05/16 19:40:20
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-16 18:16:49 IP:61.155.xxx.xxx 未訂閱
unit Unit1;    interface    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, ExtCtrls;    type   TForm1 = class(TForm)     Timer1: TTimer;     Button1: TButton;     procedure Button1Click(Sender: TObject);     procedure Timer1Timer(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;    var   Form1: TForm1;   tmphh:word; implementation    {$R *.dfm} //启动TIMER procedure TForm1.Button1Click(Sender: TObject); var hh,mm,ss,ms:word; begin DecodeTime(time,hh,mm,ss,ms); tmphh:=hh+1; Timer1.Interval:=200; Timer1.Enabled:=true;    end;    //检测是否为一小时 procedure TForm1.Timer1Timer(Sender: TObject); var hh,mm,ss,ms:word; begin DecodeTime(time,hh,mm,ss,ms); IF HH=TMPHH THEN BEGIN //每各一小时,自动增加记数1 tmphh:=hh+1; //............. //你的操作! END; end;    end.    风花雪月 e梦情缘
------
风花雪月 e梦情缘
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-16 18:17:27 IP:61.30.xxx.xxx 未訂閱
把INTERVAL 設成 60000 為每分鐘處發一次 在ontimer 裏面做一個變數去 當 到60,就代表過了六十分鐘,就是一個小時 就可以去了 clock if (clock == 60) { 做你想做的事 clock = 0; <--別忘了把clock 清除 }
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-16 19:03:16 IP:218.16.xxx.xxx 未訂閱
第三者評價 :  wnhoo 兄的方法 : 1. 每秒做5次 Decode date 一小時裡做 60 X 60 X 5 = 1800 次 Decode Date 來為了一次的使用似乎有點浪費資源 2. 最多只能運作一天因午夜 後 Tmphh 永遠比 hh 大。    turboted 版主的方法應可行, Delphi 的程式碼如下 :
var 
  Form1 : TForm1;
  Clock : integer;    procedure TForm1.FormCreate(Sender : TObject);
begin
  ....
  ....
  clock := 0;
end;    procudure TForm1.Timer1Timer(Sender : TObject);
begin
  inc(Clock);
  if clock = 60 then
  begin
    //做你想做的事 
    clock := 0; //<--別忘了把clock 清除
  end;
end;
不用給分我因我只是評價和翻譯。
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-16 19:14:12 IP:61.155.xxx.xxx 未訂閱
Justmade兄的评论是对的,我的方法是有点浪费资源。    但刚开始运行TIMER时候,必须每5秒左右检查一次,因为第一次运行时间距正点不定;但第一次运行后应加大点,就30分钟一次吧    部分改动一下: //检测是否为一小时 procedure TForm1.Timer1Timer(Sender: TObject); var hh,mm,ss,ms:word; begin DecodeTime(time,hh,mm,ss,ms); IF HH=TMPHH THEN BEGIN //根据实际情况,自行调整 Timer1.Interval:=30*60*1000; //每各一小时,自动增加记数1 tmphh:=hh 1; //............. //你的操作! END; end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-16 19:14:23 IP:61.155.xxx.xxx 未訂閱
Justmade兄的评论是对的,我的方法是有点浪费资源。    但刚开始运行TIMER时候,必须每5秒左右检查一次,因为第一次运行时间距正点不定;但第一次运行后应加大点,就30分钟一次吧    部分改动一下: //检测是否为一小时 procedure TForm1.Timer1Timer(Sender: TObject); var hh,mm,ss,ms:word; begin DecodeTime(time,hh,mm,ss,ms); IF HH=TMPHH THEN BEGIN //根据实际情况,自行调整 Timer1.Interval:=30*60*1000; //每各一小时,自动增加记数1 tmphh:=hh 1; //............. //你的操作! END; end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-16 19:14:33 IP:61.155.xxx.xxx 未訂閱
Justmade兄的评论是对的,我的方法是有点浪费资源。    但刚开始运行TIMER时候,必须每5秒左右检查一次,因为第一次运行时间距正点不定;但第一次运行后应加大点,就30分钟一次吧    部分改动一下: //检测是否为一小时 procedure TForm1.Timer1Timer(Sender: TObject); var hh,mm,ss,ms:word; begin DecodeTime(time,hh,mm,ss,ms); IF HH=TMPHH THEN BEGIN //根据实际情况,自行调整 Timer1.Interval:=30*60*1000; //每各一小时,自动增加记数1 tmphh:=hh 1; //............. //你的操作! END; end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘
shiungyi
一般會員


發表:14
回覆:33
積分:9
註冊:2003-05-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-19 11:50:25 IP:163.29.xxx.xxx 未訂閱
對不起       因為又出現新的問題       請問在DELPHI中使用SQL語法       是否有限制       以下是小弟的原始碼              with Query1 do begin                   Query1.Close;                   Query1.SQL.Clear;                   Query1.SQL.Add('insert into STBCFC');                   Query1.SQL.Add('values'(''+curr+'',''+bank+'',''+ser_no+'',)');                   Query1.SQL.Add(''+top+'',''+date+'',''+job_code+'',''+data_no+'',);                   Query1.SQL.Add(''+ban_idno+'',''+p_code+'',''+p_date+'',''+name+'',);                   Query1.SQL.Add(''+kind_code+'',''+data_kind+'',''+data_atm_sign+'',);                   Query1.SQL.Add(''+data_atm+'',''+inst_amt_sign+'',''+inst_amt+'',);                   Query1.SQL.Add(''+ward_split+'',''+cntry+'',''+nt_exchg_rate+'',);                   Query1.SQL.Add(''+swift_bank+'',''+oppo_bank+'',''+data_source+'');                   ExecSQL;                   end    ***[Error] Unit1.pas(83): Too many actual parameters    請各位高手賜教    謝謝
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-19 11:56:17 IP:61.30.xxx.xxx 未訂閱
我建議您把新問題獨立出來 才不會和標題不符..謝謝
shiungyi
一般會員


發表:14
回覆:33
積分:9
註冊:2003-05-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-19 12:10:08 IP:163.29.xxx.xxx 未訂閱
謝謝turboted兄的指正 小弟馬上更正
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-19 12:43:32 IP:211.76.xxx.xxx 未訂閱
引言: 請問 小弟目前撰寫一支程式 必須每整點讀檔一次 然後UPDATE回DATABASE 可是TIMER的INTERVAL所允許的時間長度不夠 請問該如何設定,方能使程式每整點執行一次 PS.小弟是第一次寫DELPHI程式,工具為DELPHI4,之前有試過 以WINDOW排程來設定,但因其最快也只能每日一次,不符需求 希望各位高手能指點迷津 謝謝
關於你的timer問題提供一點建議
1.你的程式應該是一直執行中.
2.必須每整點讀檔一次,因為是整點讀檔所以只要進入Timer1Timer事件中判斷NOW是否為整點時間再讀檔.
3.INTERVAL要設多久一次觸發並不重要一分鍾,10分鍾,30鍾,那只是觸發次數多少而已不影響整點讀檔的次數.
4.建議進入讀檔前把Timer.Enabled:=False暫時關掉Timer,讀檔完畢在把Timer.Enabled:=True讓Timer繼續運作,這樣較不會出問題.
shiungyi
一般會員


發表:14
回覆:33
積分:9
註冊:2003-05-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-19 17:32:28 IP:163.29.xxx.xxx 未訂閱
按照TURBOTED的作法 確實可行 但是無法跟SYSTEMTIME MATCH 變成每60分鐘執行一次 而非每整點執行 請問該如何更正 謝謝
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-05-19 17:39:36 IP:61.30.xxx.xxx 未訂閱
作法一(直覺的作法) 如果你要整點的話 我看你可能要先知道你可容許的最小誤差 如果您要剛剛好整點,1 sec都不能差的話 我想,您應該就是每1sec 就要check一次現在的時間 什麼時處發ontimer取決於您的『可容許的最小誤差』 如果您可接受一分鐘的誤差,那ontimer就可設一分鐘處發一次 然後再用GetLocalTime API去比對就行 作法二(比較有效率) 系統一開始RUN..你就先讀現在的時間 讀了之後,你就算還要多久時間才到 這時,你就把ONTIMER的處發時間設到那個時間之前一點點就可以 處發完後,之後時間就準了,再60min就是下一個整點 發表人 - turboted 於 2003/05/19 17:43:12
系統時間:2024-05-15 14:12:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!