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

關於'delay'問題 已爬過文了

尚未結案
CharlesWen
一般會員


發表:4
回覆:7
積分:2
註冊:2004-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-09 16:01:39 IP:211.72.xxx.xxx 未訂閱
各位安安,我又來了    關於delay的寫法,先前爬文都了解過了 但是去除Sleep的指令外(第一種) 就只剩下(第二種) void delay(DWORD delay_time) {  DWORD BeginTime;     BeginTime = GetTickCount();  do{  Application -> ProcessMessages();  }while(GetTickCount() - BeginTime < delay_time); } 類似模式的寫法    因為小弟的delay副程式是放在另一個檔案上(共用變數檔) 並未和主程式一起放    之前在用"Sleep'這個指令的時候,會造成程式停在執行緒的其中一段 所以改用第二種寫法 不過卻發現第二種寫法的迴圈數無法控制 例如:Sleep(1000)  ==>DELAY 1000ms 可是第二種寫法:delay()  ==>不管括號內的數值是多少,幾乎都是延遲4SEC    所以想請教 是否有其他的寫法可以不用Sleep指令,但是又能較精確指定我所需要的時間...
pkdemon
初階會員


發表:2
回覆:51
積分:25
註冊:2004-09-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-09 17:43:18 IP:211.22.xxx.xxx 未訂閱
CharlesWen您好,    下面是我用的方法,跟您的蠻像的,參考看看吧    
void delay(int time_period)
{
        long current ,start , lapsedCount;            if (time_period == 0)
                time_period = 1;                    start = GetTickCount();
        do
        {
                current = GetTickCount();
                lapsedCount = current - start;                    if (lapsedCount <= 0)
                        start = GetTickCount();            } while (lapsedCount <= time_period);
} 
CharlesWen
一般會員


發表:4
回覆:7
積分:2
註冊:2004-11-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-10 11:38:24 IP:211.72.xxx.xxx 未訂閱
還是不行耶 而且在我副程式執行的時候變得更慢了
orson
中階會員


發表:5
回覆:135
積分:58
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-10 16:00:24 IP:211.74.xxx.xxx 未訂閱
引言: 各位安安,我又來了 關於delay的寫法,先前爬文都了解過了 但是去除Sleep的指令外(第一種) 就只剩下(第二種) void delay(DWORD delay_time) { DWORD BeginTime; BeginTime = GetTickCount(); do{ Application -> ProcessMessages(); }while(GetTickCount() - BeginTime < delay_time); } 類似模式的寫法 因為小弟的delay副程式是放在另一個檔案上(共用變數檔) 並未和主程式一起放 之前在用"Sleep'這個指令的時候,會造成程式停在執行緒的其中一段 所以改用第二種寫法 不過卻發現第二種寫法的迴圈數無法控制 例如:Sleep(1000) ==>DELAY 1000ms 可是第二種寫法:delay() ==>不管括號內的數值是多少,幾乎都是延遲4SEC 所以想請教 是否有其他的寫法可以不用Sleep指令,但是又能較精確指定我所需要的時間... < face="Verdana, Arial, Helvetica"> 小改一行 把application.process改成sleep(0)試試 Orson
CharlesWen
一般會員


發表:4
回覆:7
積分:2
註冊:2004-11-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-10 18:10:56 IP:211.72.xxx.xxx 未訂閱
哇哈哈哈哈    還是不行    我快瘋了
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-12 00:13:06 IP:61.59.xxx.xxx 未訂閱
理論上應該是沒有問題 目前我用的Delay的函數也類似如此.準確度大概還是可以接受....重你敘述中不曉得你的程式是如何寫的 猜想你可能是開了多個Thread 去跑.....如果你有兩個Thread 去跑的話 而兩個Thread都去執行相同的 Delay的話 你覺得可能會準確Delay到你想要的時間ㄇ??.....
CharlesWen
一般會員


發表:4
回覆:7
積分:2
註冊:2004-11-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-13 11:52:42 IP:211.72.xxx.xxx 未訂閱
嗯  我只有開一個執行緒 但是有開3個動態Form    可能是delay副程式放的地方怪怪的    我在試試看好了
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-15 14:00:08 IP:203.70.xxx.xxx 未訂閱
 
int TMainForm::Delay(unsigned long d)
{
   struct  time  now;
   unsigned long s,n;
   if ( d >23*60*60*100 )     //max delay time 23 hours
    return -1;                //mini delay time 1/100 second
   gettime(&now);
   s=((unsigned long)(now.ti_hour)*360000) ((unsigned long)(now.ti_min)*6000)
      ((unsigned long)(now.ti_sec)*100) ((unsigned long)(now.ti_hund));
   for(;;)
   {
    Application -> ProcessMessages();
    gettime(&now);
    n=((unsigned long)(now.ti_hour)*360000) ((unsigned long)(now.ti_min)*6000)
       ((unsigned long)(now.ti_sec)*100) ((unsigned long)(now.ti_hund));
    if (  n < s  )
      n=24*60*60*100-s n;    //get delay time if change day
    else
      n=n-s;
    if (  n >= d  )
      break;
   }
   return 0;
}
這是我以前寫的CODE可以試試看,不過精確度只到1/100秒
系統時間:2024-05-02 14:07:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!