線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1473
推到 Plurk!
推到 Facebook!

請問 Timer 會 Re-Entry 嗎 ?

答題得分者是:andychang1690
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-21 14:10:19 IP:210.69.xxx.xxx 未訂閱
請問 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-21 15:30:54 IP:220.135.xxx.xxx 未訂閱
Hi pcboy2 你好: 剛剛測了一下, 大概知道原因, 每當去執行IdHttp1.Get時, 程式會去等待執行完後才交回控制權, 但是實際上Timer的時間還是會去計算, 所以不是直接從4顯示7而是5 6 顯示很快就跳過去, 若網路更慢, 跳的區間會更大, 以前我也有做過類似的程式, 最後是改成Thread的方式去做, 效果更佳. 我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/09/21 15:33:10
------


我不是高手, 高手是正在銀幕前微笑的人.
Albertz
初階會員


發表:2
回覆:57
積分:31
註冊:2002-09-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-21 21:43:11 IP:220.137.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-26 08:00:21 IP:203.204.xxx.xxx 未訂閱
引言: 實際上Timer的時間還是會去計算, 所以不是直接從4顯示7而是5 6 顯示很快就跳過去 實際上Timer的時間還是會去計算 ??? i 值不是系統時間, 而是我自己加的變數, 所以因該是有進入 Timer1Timer 函式才會增加 不太會進入 Timer1Timer 後, 有的做, 有的沒做吧
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-26 08:19:26 IP:203.204.xxx.xxx 未訂閱
[quote] pcboy2兄舉的例子有一些陷阱 [code] 不懂您的說明耶 :( 假設 IdHTTP1.Get 需要時間超過 1000, 您的 Sleep 也超過 1000, 兩個程式的情況應該半斤八兩, 為何您的程式可以印出連續值, 小弟的不行
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-29 11:45:06 IP:221.169.xxx.xxx 未訂閱
引言:
引言: pcboy2兄舉的例子有一些陷阱
不懂您的說明耶 :( 假設 IdHTTP1.Get 需要時間超過 1000, 您的 Sleep 也超過 1000, 兩個程式的情況應該半斤八兩, 為何您的程式可以印出連續值, 小弟的不行 發表人 - pcboy2 於 2004/09/27 11:25:46
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
------
Andy Chang
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-30 10:27:49 IP:210.69.xxx.xxx 未訂閱
請問如果希望 4,5,6,7 順利顯示, 而非 4 後跳到 7 該如何修改程式 ? 謝謝 !
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-30 11:44:26 IP:221.169.xxx.xxx 未訂閱
引言: 請問如果希望 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
系統時間:2024-05-16 2:43:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!