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

有關延遲函式的問題

尚未結案
damonlin
一般會員


發表:6
回覆:8
積分:2
註冊:2004-03-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-05 16:47:45 IP:61.30.xxx.xxx 未訂閱
請問各位大大 我要做一個 Delay( )的副程式,是用來做延遲用的。 但裏面不能用Sleep( ),因為延遲時會不接受控制。 但又不能用Application->ProcessMessages( ) , 因為此程式中不斷的 call Delay( )這個副程式,所以當程式跑近一個鐘頭時 會出現 " Canvas can not be drawing " 的錯誤訊息。 雖然不確定錯誤是否由 Application->ProcessMessages( ) 產生, 但我把這行拿掉後,的確就沒再發生上面的情形。 所以,除了這兩個方法外,還有其他方法可以做delay,但又不會 hand 住不能控制的嗎? 想用 TIMER 做,但不知方法,還請大大賜教。 另外,有人遇過我說的那個error message嗎?是怎麼一回事呢?
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-05 17:15:19 IP:218.163.xxx.xxx 未訂閱
可以將你的Delay()的程式碼貼上來嗎? 這樣大家比較好找出你的問題。
damonlin
一般會員


發表:6
回覆:8
積分:2
註冊:2004-03-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-05 18:24:49 IP:61.30.xxx.xxx 未訂閱
[code]
int dly;
.........................
..........................    void delay( int Dtime )
{
    dly=0;
    while(dlyProcessMessages();
        dly  ;
      }
    return;
}
發表人 - taishyang 於 2004/04/05 18:32:55
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-05 21:50:50 IP:163.29.xxx.xxx 未訂閱
damonlin 您好: 請參考如下的程式碼,再按照需求修改
.h
void __fastcall delay(int s);    .cpp
#include "dateutils.hpp"
void __fastcall TForm1::delay(int s)
{
   TDateTime gTime,dTime;
   gTime = Now();
   dTime = IncSecond(gTime,s); //s為延遲秒鐘數       while(gTime < dTime)
   {
     Application->ProcessMessages();
     Caption = Caption.sprintf("現在時間:%s -> 停止時間:%s",gTime.FormatString("hh:nn:ss"),dTime.FormatString("hh:nn:ss"));
     gTime = Now();
   }       Caption = Caption.sprintf("時間到(%s)",dTime.FormatString("hh:nn:ss"));
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   delay(9);
}
希望對你有幫助 發表人 -
damonlin
一般會員


發表:6
回覆:8
積分:2
註冊:2004-03-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-05 22:59:41 IP:211.76.xxx.xxx 未訂閱
g6101 您好 謝謝你的回答 但我不能用Application->ProcessMessages(); 因為這個程式跑個一小時下來,會有錯誤產生。 所以才在找其他的替代方法
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-05 23:22:34 IP:163.29.xxx.xxx 未訂閱
damonlin您好: (1)我貼上的程式碼是否已測試過了嗎? (2)"Canvas can not be drawing" 錯誤訊息,應該不是由ProcessMessages()造成的,從訊息上字義應屬它Sleep()在作怪(需求證)?
damonlin
一般會員


發表:6
回覆:8
積分:2
註冊:2004-03-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-06 00:31:27 IP:211.76.xxx.xxx 未訂閱
g6101您好,我正在測您的code, #include "dateutils.hpp" 這行有誤,請問是打錯還是.....
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-06 02:38:19 IP:61.30.xxx.xxx 未訂閱
damonlin您好:
#include //需引入
void __fastcall Tform1::Delay(unsigned int mSec)
{
 unsigned int StartTime,CheckTime;
 StartTime=timeGetTime();
 do
   { CheckTime=timeGetTime();
     if(StopProg) break;
   }
 while ((CheckTime-StartTime)<=mSec);
}
試試看這個,可能就沒問題了,跟Sleep函數用法一樣. --==多看.多學.多聽==--
------
--==多看.多學.多聽==--
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-06 07:37:22 IP:61.226.xxx.xxx 未訂閱
damonlin您好: 啊!真不好意思忘了你可能不是用>< class="code">.h void __fastcall Delay(DWORD Msecs); .cpp void __fastcall TForm1::Delay(DWORD Msecs) { DWORD BeginTime = GetTickCount(); do { Application->ProcessMessages(); } while ((GetTickCount() - BeginTime) < Msecs); } 希望對你有幫助 發表人 -
damonlin
一般會員


發表:6
回覆:8
積分:2
註冊:2004-03-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-06 07:56:24 IP:61.30.xxx.xxx 未訂閱
謝謝 HomeSound 和 g6101 的大力幫忙 這個部份已經OK了。 雖然" Canvas can not be drawing " 已經不會出現了, 但我的程式還是有問題,程式跑個一個小時後還是會失效。 不過我想這應該是我程式流程上出了什麼錯導致。 謝謝各位大大!!
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-06 11:36:32 IP:218.32.xxx.xxx 未訂閱
damonlin您好,    1.請問您呼叫Delay(DWORD Msecs)時,Msecs給多大?    2. " Canvas can not be drawing " 已經解決了,您應該結案。 因為[程式跑個一個小時後還是會失效]是另外一個問題,需要開新的討論。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
damonlin
一般會員


發表:6
回覆:8
積分:2
註冊:2004-03-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-04-06 16:17:15 IP:61.30.xxx.xxx 未訂閱
對不起 我回上一個留言時就想結案了 結果忘了按,真是對不起用力回答的大大們!!
系統時間:2024-11-23 20:33:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!