求助:串口编程用到线程时,CPU使用率达到100%,怎么解决?(在线等待)

xjb258 2004-03-16 04:07:43
源代码如下:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
extern HANDLE hComm;
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall Unit2::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
__fastcall TReadThread::TReadThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TReadThread::Execute()
{ //---- Place thread code here ----
while (! Terminated)
Synchronize(ReadData);
}
//---------------------------------------------------------------------------
void __fastcall TReadThread::ReadData()
{
String Temp;
char inbuff[1024];
DWORD nBytesRead, dwEvent,dwTrans,dwError;
COMSTAT cs;
if (hComm == INVALID_HANDLE_VALUE)
return;

ClearCommError(hComm,&dwError,&cs); //取得状态

if (cs.cbInQue > sizeof(inbuff)) // 数据是否大于我们所准备的Buffer
{ PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据
return;
}
ReadFile(hComm,inbuff,cs.cbInQue,&nBytesRead,NULL); // 接收COM 的数据

inbuff[cs.cbInQue]= '\0'; // 转移数据到变量中

if (strlen(inbuff)>0) // 将数据显示在Memo1上
Form1->mReceive->Text = Form1->mReceive->Text + inbuff;
}
//--------------------------------------------------------------------------
...全文
129 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
solares1 2004-04-09
  • 打赏
  • 举报
回复
gz
r302t 2004-03-19
  • 打赏
  • 举报
回复
最好看一下关于串口方面的书,我的印象中好象要加串口等待函数,设置中断事件。
hainanb 2004-03-19
  • 打赏
  • 举报
回复
gz
kataboy 2004-03-17
  • 打赏
  • 举报
回复
楼主,我有一个建议,不知道有道理否?
我觉得你这样子做与不用线程是一样的效果,所以我觉得你没有必要用线程要是你想用线程最好改成以后的,同时解决100%CPU占用率:

源代码如下:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
extern HANDLE hComm;
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall Unit2::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
__fastcall TReadThread::TReadThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TReadThread::Execute()
{ //---- Place thread code here ----
while (! Terminated) {

String Temp;
char inbuff[1024];
DWORD nBytesRead, dwEvent,dwTrans,dwError;
COMSTAT cs;
if (hComm == INVALID_HANDLE_VALUE)
return;

ClearCommError(hComm,&dwError,&cs); //取得状态

if (cs.cbInQue > sizeof(inbuff)) // 数据是否大于我们所准备的Buffer
{ PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据
return;
}
ReadFile(hComm,inbuff,cs.cbInQue,&nBytesRead,NULL); // 接收COM 的数据

inbuff[cs.cbInQue]= '\0'; // 转移数据到变量中

if (strlen(inbuff)>0) // 将数据显示在Memo1上
Synchronize(ReadData);
Sleep(100);//加上这句可以不让CPU占用100%
}
}
//---------------------------------------------------------------------------
void __fastcall TReadThread::ReadData()
{
Form1->mReceive->Text = Form1->mReceive->Text + inbuff;
}
//--------------------------------------------------------------------------


当然,你要想做到最好,当然是用事件来做。就是说先创建一个事件,然后调用waitXXXX系列函数!
^_^
bjwf01 2004-03-16
  • 打赏
  • 举报
回复
请检查其他程序是否占用了串口,例如安装了调制解调器。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧