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

請問副程式可以呼叫Timer嗎??

尚未結案
yangdada
一般會員


發表:7
回覆:6
積分:2
註冊:2004-06-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-06 20:29:48 IP:140.124.xxx.xxx 未訂閱
請問副程式可以呼叫Timer嗎?? 另外~如何讓程式停留一段我可以控制的時間後 再繼續動作!? 謝謝!
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-06 21:35:50 IP:218.19.xxx.xxx 未訂閱
yangdada 您好:    不太確定您的第一個問題到底是指何種狀況?要使用 Timer 可以直接拉一個 TTimer 物件到 Form 上,要使用時設定 Timer 物件的 Interval 屬性 (微秒,及千分之ㄧ秒) 為執行週期,然後設 Enabled 屬性為 true,不想使用時就設為 false 即可,這個動作不限定在何處設定,因此副程式中也可以作設定,除非有什麼特殊的狀況您未加以說明。    另外一個問題可以使用 Sleep() 這個 API 來使程式 "暫時" 停留一下,使用時設定的參數是 "微秒" 數,也就是千分之ㄧ秒,如果設定值為 Sleep(3000) 就代表暫停 3 秒鐘,但如果在這段停留的時間裡想要不影響程式中其它正在運作的部份以及其它的程式時,請改用下列的自定函數:
void Delay(DWORD Msecs)
{
    DWORD BeginTime = GetTickCount();        do{
        Application->ProcessMessages();
    }while((GetTickCount() - BeginTime) < Msecs);
}
使用 Delay() 函數時設定的參數與 Sleep() 函數一樣,都是 "微秒" 數。
yangdada
一般會員


發表:7
回覆:6
積分:2
註冊:2004-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-07 11:01:45 IP:140.124.xxx.xxx 未訂閱
謝謝您的答覆~ 以下把我的程式貼上    
 
void singlehole(double depth)
{    action0=1;
depth=depth 0.5;
count=0;    while(action0>0)
{
 if(AD() > 0.4)
 {
   zp(0.0001);
     count=count-0.0001  ;
 }  //if
if(0.4 > AD() > 0.35)
 {
    zp(0.00005)  ;
      count=count-0.00005;
  } //if
if(0.35 > AD() > 0.3)
   {
Delay(8);
Timer1-> Enabled=true;//    <-- 問題在這~
     }//if
if ( 0.3 > AD() > 0.2)
  {
Delay(10);
   }//if
if( 0.2> AD() > 0.1)
   {
   zn(0.00005);
       count=count 0.00005;
    }  //if
    if(AD() < 0.1)
  {
  zn(0.0001);
      count=count 0.0001;
   }  //if       if(count>depth)
   {
   break;
   }   //if
Application->ProcessMessages();    }
zp(depth);
} 
[C Error] controlplant.cpp(127): E2451 Undefined symbol 'Timer1'
Jiahong1012
一般會員


發表:7
回覆:17
積分:9
註冊:2004-11-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-07 11:44:41 IP:203.75.xxx.xxx 未訂閱
Hi yangdada, Please try this: Form1->Timer->Enable = true
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-07 13:17:01 IP:219.137.xxx.xxx 未訂閱
yangdada 您好: 原來您有程式的錯誤訊息啊~那您早點貼出來,問題大概很快就能解決的。 依據您的錯誤訊息顯示,您可能是將 Timer1 設在其它的 Form 上面或是並未設定 Timer1,如果您的 Timer1 是設在 Form1 上面,那麼解決之道正如 Jiahong1012 所述的,同時您也必須確定 controlplant.cpp 有 include Form1.h (如果設定 Timer1 的 Form 不是 Form1 的話,就 include 那個設定了 Timer1 物件那個檔案的 .h 檔),如果您並沒有在其它地方用到 Timer1,也還沒有設定 Timer1 的話,那就得先拉一個 TTimer 物件 (在元件盤的 System 類別中) 到現在使用的 Form 上面來。
yangdada
一般會員


發表:7
回覆:6
積分:2
註冊:2004-06-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-07 15:51:56 IP:140.124.xxx.xxx 未訂閱
感謝您的回答    
void Delay((DWORD Msecs);
//---------------------------------------------------
void Delay(DWORD Msecs)
{
    DWORD BeginTime = GetTickCount();        do{
        Application->ProcessMessages();
    }while((GetTickCount() - BeginTime) < Msecs);
}
//---------------------------------------------------
void singlehole(double depth)
{    action0=1;
depth=depth 0.5;
count=0;    while(action0>0)
{
 if(AD() > 0.4)
 {
   zp(0.0001);
     count=count-0.0001  ;
 }  //if
if(0.4 > AD() > 0.35)
 {
    zp(0.00005)  ;
      count=count-0.00005;
  } //if
if(0.35 > AD() > 0.3)
   {
Delay(8);//      <--問題!!
Plant->Timer1-> Enabled=true;// 此處解決   
     }//if
if ( 0.3 > AD() > 0.2)
  {
Delay(10);   <--問題!!
   }//if
if( 0.2> AD() > 0.1)
   {
   zn(0.00005);
       count=count 0.00005;
    }  //if
    if(AD() < 0.1)
  {
  zn(0.0001);
      count=count 0.0001;
   }  //if       if(count>depth)
   {
   break;
   }   //if
Application->ProcessMessages();    }
zp(depth); 
}
下午試機發現如果加上Delay function後 硬體就開始停滯 請問DWORD是何種宣告方式??
jimmy_and_you
初階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-07 18:02:32 IP:203.70.xxx.xxx 未訂閱
引言: 感謝您的回答
void Delay((DWORD Msecs);
//---------------------------------------------------
void Delay(DWORD Msecs)
{
    DWORD BeginTime = GetTickCount();        do{
        Application->ProcessMessages();
    }while((GetTickCount() - BeginTime) < Msecs);
}
//---------------------------------------------------
void singlehole(double depth)
{    action0=1;
depth=depth 0.5;
count=0;    while(action0>0)
{
 if(AD() > 0.4)
 {
   zp(0.0001);
     count=count-0.0001  ;
 }  //if
if(0.4 > AD() > 0.35)
 {
    zp(0.00005)  ;
      count=count-0.00005;
  } //if
if(0.35 > AD() > 0.3)
   {
Delay(8);//      <--問題!!
Plant->Timer1-> Enabled=true;// 此處解決   
     }//if
if ( 0.3 > AD() > 0.2)
  {
Delay(10);   <--問題!!
   }//if
if( 0.2> AD() > 0.1)
   {
   zn(0.00005);
       count=count 0.00005;
    }  //if
    if(AD() < 0.1)
  {
  zn(0.0001);
      count=count 0.0001;
   }  //if       if(count>depth)
   {
   break;
   }   //if
Application->ProcessMessages();    }
zp(depth); 
}
下午試機發現如果加上Delay function後 硬體就開始停滯 請問DWORD是何種宣告方式??
1.會停滯是因為你的WHILE LOOP是個BUSY LOOP 一直在執行迴圈內容(包含DELAY),應該把整段程式改在TIMER理做會好好一點(Delay可在TIMER理加個STATIC變數當COUNTER模擬). 2.DWORD在BCB裡是指4個BYTE的無號整數,相當於unsigned int 或是 unsigned long.
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-07 20:07:29 IP:218.19.xxx.xxx 未訂閱
yangdada 您好: 1. DWORD 是 double word,也就是 jimmy_and_you 講的四個 byte,就一般需要延遲的動作而言應該夠用了。 2. 您不是要讓程式 "停留" 一段您可以控制的時間嗎?除非您的程式有特殊的流程,否則用 Sleep() 或 Delay() 應該是可行的,但是您可能需要確認一下您設定的 delay 值要能與硬體的運作時間配合好才行,我對硬體不熟悉而且不清楚您的整個程式倒底是怎麼樣的一個流程與架構?或許您可以參考 jimmy_and_you 的建議試試看,或是參考那個硬體的技術資料,自己調整一下 delay 值做些測試,以抓到合適的數值。 要不然您乾脆另外開個題目,然後說明一下整個程式的用途是什麼?有問題的那段程式內為何要作 delay?Timer 做些什麼事情?為何要在 while loop 裡有著 Timer enabled 的設定卻無 disabled 的設定....等等,然後說明問題的所在,這樣或許能比較快得到其他有經驗的網友們協助 (因本題已結案,可能會有些先進們不會進來看)。
系統時間:2024-05-19 11:46:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!