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

timer計時問題

尚未結案
mikie0520
一般會員


發表:2
回覆:1
積分:0
註冊:2017-06-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2017-06-29 10:27:21 IP:61.219.xxx.xxx 未訂閱
請問一下各位大大
小弟我的程式碼如下
void __fastcall TForm1::ReceiveClick(TObject *Sender){
Edit5->Text=5;//倒數5秒
Timer1->Interval=1000; //1秒更新1次
Timer1->Enabled=true;//開始計時
unsigned long lrc,BS,PC;
COMSTAT cs;
if (hComm==0) {ShowMessage("Please open the port");return;} //檢查Handle值
ClearCommError(hComm,&PC,&cs);//取得COM狀態
int iTimes=0;
for(int i=0;i ReadFile(hComm,&pcReceData[iTimes ],1,&lrc,NULL);
if(cs.cbInQue>0&&Edit5->Text=="0"){//時間到沒收完
Edit3->Text="fffe";
DLE_packing->Click();
Send->Click();
return;
}
}
unsigned long ulRecDat=sizeof(pcReceData)/sizeof(BYTE);
for(int i=0;i BYTE bDoc=pcReceData[i];
String caSrc=IntToHex(bDoc&0xff,2);
Memo2->Text=Memo2->Text caSrc;
}
}

Timer程式碼:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int iDes=StrToInt(Edit5->Text);
iDes--;
Edit5->Text=IntToStr(iDes);
if(iDes<=0){Timer1->Enabled=false;}
}

會發生以下狀況:
在Memo2區塊顯示完收集的資料後
才會開始計時

目前是要做一個Timeout機制
在5秒內要收完所有資料
如果沒有就傳錯誤訊息給終端
傳輸方式是RS232

小弟我對於BCB完全是生手
對於這個問題 希望各位高手們
能夠指點一二
希望能知道
1.為什麼會發生這樣的狀況
2.如果要達成我的目的 有其他更好的方式嗎?

謝謝各位
編輯記錄
mikie0520 重新編輯於 2017-06-29 17:11:47, 註解 無‧
mikie0520 重新編輯於 2017-06-29 17:11:47, 註解 無‧
mikie0520 重新編輯於 2017-06-29 17:12:24, 註解 無‧
mikie0520 重新編輯於 2017-06-29 17:54:17, 註解 無‧
mikie0520
一般會員


發表:2
回覆:1
積分:0
註冊:2017-06-29

發送簡訊給我
#2 引用回覆 回覆 發表時間:2017-06-29 23:48:24 IP:58.114.xxx.xxx 未訂閱
上面那題改好了
把要做的事放在timer裡就行了
現在另一個問題是
我現在希望接收到1個資料後
立刻將Timer設為1並馬上觸發
可是照我的寫法 是接收到一筆資料並過了1秒後
才繼續接收資料
可以請各位版上大大指點嗎?3Q
小弟我對於BCB真的是新手

程式碼如下

unsigned long ulRecelrc;
if(ReadFile(hComm,&pcReceData[iTimes],1,&ulRecelrc,NULL)){
BYTE bDoc=pcReceData[iTimes];
String caSrc=IntToHex(bDoc&0xff,2);
Memo3->Text=Memo3->Text caSrc;
iTimes ;
Timer2->Enabled=false;
Timer2->Interval=1000;
Timer2->Enabled=true;
}
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2017-07-12 12:37:33 IP:210.61.xxx.xxx 未訂閱
學生做專題???
如果不是,那你應該不常接觸Windows AP的開發.尤其是通訊這個領域應用.
通訊不是這樣幹的啦!
通訊的接收最好要在Thread中,並使用Wait的方式去等待資料,所有Timeout控制不會使用Timer
網路上有許多相關程式碼,多去看看吧!!!

===================引 用 mikie0520 文 章===================
上面那題改好了
把要做的事放在timer裡就行了
現在另一個問題是
我現在希望接收到1個資料後
立刻將Timer設為1並馬上觸發
可是照我的寫法 是接收到一筆資料並過了1秒後
才繼續接收資料
可以請各位版上大大指點嗎?3Q
小弟我對於BCB真的是新手

程式碼如下

unsigned long ulRecelrc;
if(ReadFile(hComm,&pcReceData[iTimes],1,&ulRecelrc,NULL)){
BYTE bDoc=pcReceData[iTimes];
String caSrc=IntToHex(bDoc&0xff,2);
Memo3->Text=Memo3->Text caSrc;
iTimes ;
Timer2->Enabled=false;
Timer2->Interval=1000;
Timer2->Enabled=true;
}
系統時間:2024-05-15 23:38:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!