首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

C++ Builder线程有关问题

2012-03-16 
C++ Builder线程问题求教大家,弄了两周了,一直没弄好。何谓一个健康的线程?打个比方,我现在做一个应用程序,

C++ Builder线程问题
求教大家,弄了两周了,一直没弄好。
何谓一个健康的线程?打个比方,我现在做一个应用程序,他要从串口读取数据,而串口有时有数据,有时没数据,但是串口一直打开,我在线程中使用一个死循环去读取串口数据,一旦有串口有数据返回,那么就立即读取。这样的话,线程至少要满足什么条件才能正常的工作呢?我的理解是,因为线程主执行函数Execute()中加入了死循环,只要线程启用,那么线程就一直在运行,只要串口有数据返回,就可以迅速读取到,但是我在实际运行的时候虽然可以读到数据,但是读取两次的话线程就Faulted了,出错了。大虾们能帮小弟解说解说都可能有什么原因吗?谢谢了。

下面是创建线程程序

//---------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "CommDataRevThread.h"
#include "commPort.h"
#include "main.h"
#pragma package(smart_init)
//---------------------------------------
// 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 CommDataRevThread::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------
extern HANDLE gCommFile;//串口句柄
extern bool ComIsOpenFlag;//串口打开标志
//extern OVERLAPPED m_Read;
extern OVERLAPPED rOverLaped;
__fastcall CommDataRevThread::CommDataRevThread(bool CreateSuspended)
  : TThread(CreateSuspended)
{
  Priority = tpNormal;
}
//---------------------------------------
void __fastcall CommDataRevThread::Execute()
{
  //---- Place thread code here ----
  DWORD pFilesize=GetFileSize(gCommFile,NULL);
  char *lpInBuffer = new char(pFilesize+1);
  COMSTAT ComStat;
  DWORD dwBytesRead,dwErrorFlags;
  DWORD event,ecode;
  rOverLaped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  if(NULL == rOverLaped.hEvent)
  {
  CloseHandle(rOverLaped.hEvent);
  return;
  }
  if(!ComIsOpenFlag)
  {
  return;//设备未打开
  }
   
  while(1)
  {
  //读取串行设备当前状态  
  ClearCommError(gCommFile,&dwErrorFlags,&ComStat);
  dwBytesRead = ComStat.cbInQue;
  if(dwBytesRead>0)
  {
  //读取数据
  if(!ReadFile(gCommFile,lpInBuffer,dwBytesRead,&dwBytesRead,&rOverLaped))
  dwBytesRead=0;
  }
  }
}
//---------------------------------------

这是创建线程并启用
  CommDataRevThread *ComdataReadThread = new CommDataRevThread(true);
  ComdataReadThread->Resume();


[解决办法]
地址错误,肯定是地址越界、指针方面的问题
明显的lpInBuffer有new,没有对应的delete
[解决办法]
我觉得还是同步方面出了问题,多线程争夺同个资源引起的AV。

热点排行