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

有關迴圈和Application->ProcessMessages();的迷惑?

尚未結案
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-22 10:58:00 IP:218.160.xxx.xxx 未訂閱
 
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"    int Quit = 0;  // Quit==1 則離開迴路
int Count=0;   // 計算按button1幾次    TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Count  ;
  int k=Count;
  while (Quit==0 && k==Count)      //Quit==1或再按下button1時,離開迴路
  {
    Application->ProcessMessages();
  }
  ShowMessage(k);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Quit = 1;
}
//---------------------------------------------------------------------------
1.簡單的程式,假如我依序按3次的button1和1次的button2會出現什麼結果? ShowMessage(k);的順序會如何呢? 2.那假如我想,當按下第2次的button1時,會顯示1(代表按第一次己執行完畢) 按下第3次的button1時,會顯示2(代表按第二次己執行完畢) 再按一下button2,則顯示3(代表按第三次己執行完畢) 那我該如何做呢? 3.我的腦袋己進入迴路中,轉不出來了,有請各位高手的幫忙,謝謝.
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-22 11:06:21 IP:203.73.xxx.xxx 未訂閱
引言:
 
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"    int Quit = 0;  // Quit==1 則離開迴路
int Count=0;   // 計算按button1幾次    TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Count  ;
  int k=Count;
  while (Quit==0 && k==Count)      //Quit==1或再按下button1時,離開迴路
  {
    Application->ProcessMessages();
  }
  ShowMessage(k);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Quit = 1;
}
//---------------------------------------------------------------------------
1.簡單的程式,假如我依序按3次的button1和1次的button2會出現什麼結果? ShowMessage(k);的順序會如何呢? 2.那假如我想,當按下第2次的button1時,會顯示1(代表按第一次己執行完畢) 按下第3次的button1時,會顯示2(代表按第二次己執行完畢) 再按一下button2,則顯示3(代表按第三次己執行完畢) 那我該如何做呢? 3.我的腦袋己進入迴路中,轉不出來了,有請各位高手的幫忙,謝謝.
brook 你好: 小弟我給你一個建議,先在 Form 上拉一個 Memo1,然後分別把 Count & Quit 的值秀在 Memo1 裡面,真相自然可以大白 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-22 14:16:38 IP:218.160.xxx.xxx 未訂閱
包大人 你好: 不好意思,小弟還是不明白,可否請包大人明示. 其實小弟的原始程式不是這樣,而是經過整理才擬出最主要的關念卡在這裡而無法自拔,原始程式幾千行,目的是上網download多個檔案,如先download第一個檔 a.txt,並用 do while來等待結果,檢查檔案是否download完成. 假如要一直等待到傳輸完成後再來處理下一個檔案,這還不是問題. 問題是:我想在download第二個檔案 b.txt時,就不管 a.txt是否download完成,(完成回應1,未完成回應-1),緊接download 第2個檔 b.txt(因為 a.txt己是過時資料,要等到它download完是很浪費時間的). 但我就是要先知道 a.txt是否是否傳輸完成,就像上面的程式,按下第2次button1時,要會顯示1(代表按第一次己執行完畢) 測的結果都是要等到按下button2時,才依序顯示3,2,1. 下知要如何,才能達到我想要的目的? 2.那假如我想,當按下第2次的button1時,會顯示1(代表按第一次己執行完畢) 按下第3次的button1時,會顯示2(代表按第二次己執行完畢) 再按一下button2,則顯示3(代表按第三次己執行完畢) 那我該如何做呢? 還是有其他的替代方案可以解決這個問題? 上面的小程式 run 起來的答案,可能會和原先想的不一樣.
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-22 14:28:26 IP:203.73.xxx.xxx 未訂閱
引言: 包大人 你好: 不好意思,小弟還是不明白,可否請包大人明示. 其實小弟的原始程式不是這樣,而是經過整理才擬出最主要的關念卡在這裡而無法自拔,原始程式幾千行,目的是上網download多個檔案,如先download第一個檔 a.txt,並用 do while來等待結果,檢查檔案是否download完成. 假如要一直等待到傳輸完成後再來處理下一個檔案,這還不是問題. 問題是:我想在download第二個檔案 b.txt時,就不管 a.txt是否download完成,(完成回應1,未完成回應-1),緊接download 第2個檔 b.txt(因為 a.txt己是過時資料,要等到它download完是很浪費時間的). 但我就是要先知道 a.txt是否是否傳輸完成,就像上面的程式,按下第2次button1時,要會顯示1(代表按第一次己執行完畢) 測的結果都是要等到按下button2時,才依序顯示3,2,1. 下知要如何,才能達到我想要的目的? 2.那假如我想,當按下第2次的button1時,會顯示1(代表按第一次己執行完畢) 按下第3次的button1時,會顯示2(代表按第二次己執行完畢) 再按一下button2,則顯示3(代表按第三次己執行完畢) 那我該如何做呢? 還是有其他的替代方案可以解決這個問題? 上面的小程式 run 起來的答案,可能會和原先想的不一樣.
brook 你好: 小弟我只是想提醒你一件事情,那就是~~利用 ShowMessage 得到的實驗結果, 不一定是正確的,因為 ShowMessage 會暫時讓程式停止,但是你的問題是因為 在 runtime 的時候由迴圈, ProcessMessages (或許還有 Timer, Thread) 所造 ,因此最好利用 runtime 的測試方式,得到的測試結果才會是最正確的;其實 也可以不用 Memo1 來完成測試,小弟我的習慣,只要一碰到類似這種的問題, 都會利用 DebugView 來做 runtime 的測試,結果非常的準確喔< >,如果願意 的話,建議你試試看 (有的時候,程式流程會跟你想像的完全不同)< > http://delphi.ktop.com.tw/topic.php?TOPIC_ID=25142 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34857 -- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2003/10/22 14:59:40
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-11-22 22:09:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!