读取位置时访问冲突

xiaobaohaohao 2008-12-09 04:13:59
多线程串口通信 。
1.在程序结束时,DOC 析构时清空输入输出缓冲区,然后结束线程。但结束线程之前,线程进行了OnReceive()(消息响应),在OnReceive()中 CESimulationDoc* pDoc=GetCurrentDoc();获得DoC指针,结果就中断在这里了。
是不是Doc已经析构释放,所以找不到DOC,所以中断 。该怎么办呢?

2.另外,缓冲区数据的读写如果在View中进行,线程每隔一秒会发送信息给View,然后读写,就死机了(会一直读)。程序处理消息应该是毫秒级的吧?为啥都反应不过来?

大侠帮忙!
...全文
102 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobaohaohao 2008-12-10
  • 打赏
  • 举报
回复
if(::ClearCommError(_hCommHandle, &dwError, &Stat) && dwError > 0)

死在这一句。
帮忙......
xiaobaohaohao 2008-12-10
  • 打赏
  • 举报
回复

针对第二个问题:读的原码:
DWORD CSerComm::Read(LPVOID Buffer, DWORD dwBufferLength, DWORD dwWaitTime)
{
if(!IsOpen())
return 0;

COMSTAT Stat;
DWORD dwError;

if(::ClearCommError(_hCommHandle, &dwError, &Stat) && dwError > 0)
{
::PurgeComm(_hCommHandle, PURGE_RXABORT | PURGE_RXCLEAR);
return 0;
}

if(!Stat.cbInQue) // 缓冲区无数据
return 0;

unsigned long uReadLength = 0;

dwBufferLength = dwBufferLength > Stat.cbInQue ? Stat.cbInQue : dwBufferLength;

if(!::ReadFile(_hCommHandle, Buffer, dwBufferLength, &uReadLength, &_ReadOverlapped))
{
if(::GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(_ReadOverlapped.hEvent, dwWaitTime); // 结束异步I/O
if(!::GetOverlappedResult(_hCommHandle, &_ReadOverlapped, \
&uReadLength, false))
{
if(::GetLastError() != ERROR_IO_INCOMPLETE)
uReadLength = 0;
}
}
else
uReadLength = 0;
}

return uReadLength;
}
xiaobaohaohao 2008-12-10
  • 打赏
  • 举报
回复
hai040 :谢谢
1.析构前先停止接收消息
我是在析构函数里停止消息的,
能具体一点在哪里停止消息吗?

2.哦,还没写,只是读。
hai040 2008-12-09
  • 打赏
  • 举报
回复
1.析构前先停止接收消息
2.读写做了什么工作?会不会1秒做不完?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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