請問 Timer 會 Re-Entry 嗎 ? |
答題得分者是:andychang1690
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
請問 Timer 可以重複進入嗎 ? 程式如下, 執行後, Edit1 顯示 0,1,2,3,4,(停了幾秒) 7 停了幾秒, 表示 http://delphi.ktop.com.tw/ 沒有載入完成前, 不會再進入 Timer 嗎 ? 但這樣 4 之後應該顯示 5 4 之後應該顯示 7, 表示 Timer 還是重複進入 ? 但是 Memo1 元件沒更新完成前, Edit1 也沒有更新, 表示 Form1 上面的畫面是一起更新的 ?
<textarea class="delphi" rows="10" cols="60" name="code">unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; IdHTTP1: TIdHTTP; Memo1: TMemo; Edit1: TEdit; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; i: integer; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin IdHTTP1.HandleRedirects:=true; if i=1 then Memo1.Text:=IdHTTP1.Get('http://www.kimo.org.tw/'); if i=2 then Memo1.Text:=IdHTTP1.Get('http://www.hinet.net/'); if i=3 then Memo1.Text:=IdHTTP1.Get('http://www.yahoo.com.tw/'); if i=4 then Memo1.Text:=IdHTTP1.Get('http://www.microsoft.com/'); if i=5 then Memo1.Text:=IdHTTP1.Get('http://delphi.ktop.com.tw/'); Edit1.Text:= IntToStr(i); i:=i 1; end; procedure TForm1.FormCreate(Sender: TObject); begin i:=0; end; end. </textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi pcboy2 你好:
剛剛測了一下, 大概知道原因, 每當去執行IdHttp1.Get時, 程式會去等待執行完後才交回控制權, 但是實際上Timer的時間還是會去計算, 所以不是直接從4顯示7而是5 6 顯示很快就跳過去, 若網路更慢, 跳的區間會更大, 以前我也有做過類似的程式, 最後是改成Thread的方式去做, 效果更佳. 我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/09/21 15:33:10
------
我不是高手, 高手是正在銀幕前微笑的人. |
Albertz
初階會員 發表:2 回覆:57 積分:31 註冊:2002-09-05 發送簡訊給我 |
pcboy2兄舉的例子有一些陷阱. 我把 timer handler 改寫如下 :
void __fastcall TForm1::Timer1Timer(TObject *Sender) { static iCount = 0; //!! Randomize() should be called when form created !! ::Sleep(2000 random (100)); Memo1->Lines->Add(IntToStr(iCount)); iCount ; }其中 timer1->interval = 1000. 假設 timer handler 可以 re-entry, 那我們在 Memo1 中應該可以看到不連續的整數. 但事實證明正好相反, 我們得到的是連續整數. Indy 很多 component 都會呼叫 Application->ProcessMessage() 以避免程式短時間無回應的問題. timer handler 在執行時, WM_TIMER 已經從 message queue 移除, 所以當時間到 interval 的時候, Windows 會在 message queue 再放入 WM_TIMER. 如果有人這時候再呼叫 Application->ProcessMessage(), 就會造成 RE-ENTRY 的假象. |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言:pcboy2:依Help說明Sleep是 Suspends the current thread for the specified number of milliseconds. 所以你兩測試環境是不一樣的,Albertz的Sleep(2000 random (100)); 約兩秒左右,它這段程序是延緩的。而你是不停運作。 我個人習慣進入OnTimer1Timer事件我會 Timer1.Enable:=False; // Your Job // 離開時: Timer1.Enable:=True; 請參考! Andy Chang引言: pcboy2兄舉的例子有一些陷阱不懂您的說明耶 :( 假設 IdHTTP1.Get 需要時間超過 1000, 您的 Sleep 也超過 1000, 兩個程式的情況應該半斤八兩, 為何您的程式可以印出連續值, 小弟的不行 發表人 - pcboy2 於 2004/09/27 11:25:46
------
Andy Chang |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 請問如果希望 4,5,6,7 順利顯示, 而非 4 後跳到 7 該如何修改程式 ? 謝謝 ! procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enable:=False; IdHTTP1.HandleRedirects:=true; if i=1 then Memo1.Text:=IdHTTP1.Get('http://www.kimo.org.tw/'); if i=2 then Memo1.Text:=IdHTTP1.Get('http://www.hinet.net/'); if i=3 then Memo1.Text:=IdHTTP1.Get('http://www.yahoo.com.tw/'); if i=4 then Memo1.Text:=IdHTTP1.Get('http://www.microsoft.com/'); if i=5 then Memo1.Text:=IdHTTP1.Get('http://delphi.ktop.com.tw/'); Edit1.Text:= IntToStr(i); Application.ProcessMessages; i:=i 1; Timer1.Enable:=True; end; 請參考!Andy Chang
------
Andy Chang |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |