用Thread寫RS232接收,卻十分佔系統資源? |
答題得分者是:lu
|
JapStyle
一般會員 發表:6 回覆:8 積分:2 註冊:2005-04-16 發送簡訊給我 |
我利用Thread方式去寫最基本的RS232接收程式
可是卻發現系統資源都被佔住了(Win2000顯示CPU使用率98%)
不知哪裡錯了?
我本來以為是Delay()的問題
可是拿掉了還是ㄧ樣
程式如下:
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{ char *ComNo;
DCB dcb;
String Temp;
Temp = "COM3";
ComNo = Temp.c_str();
hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, 0);
if (hComm == INVALID_HANDLE_VALUE)
{
MessageBox(0, "Open serial port error!!","Comm Error",MB_OK);
return;
}
GetCommState(hComm,&dcb);
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(hComm, &dcb))
{
MessageBox (0, "Setting serial port error!!!","Set Error",MB_OK);
CloseHandle(hComm);
return;
}
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (hComm!=INVALID_HANDLE_VALUE) CloseHandle(hComm);
exit(EXIT_SUCCESS);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Read232->Resume();
//Timer1->Enabled=true;
Receive->Text = Receive->Text "Starting\r\n";
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender)
{
Receive->Clear();
Read232->Terminate();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{
Read232 = new TRead232(true);
Read232->FreeOnTerminate=true;
} __fastcall TRead232::TRead232(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TRead232::Execute()
{
//---- Place thread code here ----
while(!Terminated) ReadData();//Synchronize(ReadData);
}
//---------------------------------------------------------------------------
void __fastcall TRead232::ReadData()
{
String Temp;
char inbuff[1024];
extern HANDLE hComm;
DWORD nBytesRead, dwEvent, dwError;
COMSTAT cs;
Form1->Receive->Clear();
ClearCommError(hComm,&dwError,&cs);
if (cs.cbInQue > sizeof(inbuff))
{
PurgeComm(hComm, PURGE_RXCLEAR);
return;
}
ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL);
inbuff[cs.cbInQue]= '\0';
Form1->Receive->Text = Form1->Receive->Text inbuff;
Delay(1000);
}
//---------------------------------------------------------------------------
void Delay(DWORD count)
{
DWORD BeginTime = GetTickCount(); do{
Application->ProcessMessages();
}while((GetTickCount() - BeginTime) < count);
}
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
JapStyle
一般會員 發表:6 回覆:8 積分:2 註冊:2005-04-16 發送簡訊給我 |
|
windblown
中階會員 發表:0 回覆:117 積分:98 註冊:2003-11-14 發送簡訊給我 |
|
JapStyle
一般會員 發表:6 回覆:8 積分:2 註冊:2005-04-16 發送簡訊給我 |
|
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |