异步模式下 程序运行一段时间后异常!

432423423423 2011-02-24 05:00:48
我的程序:
unsigned char SendBuffer[4] = {0x02, 0x10, 0x81, 0x6c};
定时器里发送数据:
OVERLAPPED m_ossend;
COMSTAT Cs;
unsigned long nwrite;
memset(&m_ossend,0,sizeof(OVERLAPPED));
m_ossend.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
unsigned char number = SendBuffer[0];
DWORD dwErrorFlags;
ClearCommError(HandleCom,&dwErrorFlags,&Cs);
if (WriteFile(HandleCom, SendBuffer, number + 2, &nwrite, &m_ossend) == 0)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_ossend.hEvent,1000);
}
}

线程里接受数据:
void __fastcall FR::Execute()
{

while(!Terminated)
{
Synchronize(Receive);
}
}
//---------------------------------------------------------------------------
void __fastcall FR::Receive()//数据接收
{
static double count= 0;

Form1->DisByteMemo->Text = count;
count++;
unsigned char ReceiveBuffer[512] = {0};
unsigned long ReceiveBufferLength = 512;
OVERLAPPED m_osRead;
COMSTAT Cs;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
unsigned long nread;
unsigned long Error;
for (int i = 0;i < ReceiveBufferLength; i++)
{
ReceiveBuffer[i] = 0x00;
}

ClearCommError(HandleCom, &Error, &Cs);

if (Cs.cbInQue > 0 )
{
int temp = min(Cs.cbInQue,ReceiveBufferLength);
if(ReadFile(HandleCom, ReceiveBuffer, temp, &nread, &m_osRead) == false)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osRead.hEvent,2000);
}
}
}
}

我在使用异步模式发送接受数据,开始的20分钟左右,发出数据和接收数据都正常。运行一段时间后,程序抛出异常,然后电脑像司机一样。求大侠给予指点。
...全文
94 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxqinge 2011-02-28
  • 打赏
  • 举报
回复
只需定义一个就可以了,然后根据GetLastError函数的返回值进行判断。
像这样的问题最后去VC\MFC版块问,呵呵哪里解答的人会更多些,四处开花嘛
sxqinge 2011-02-25
  • 打赏
  • 举报
回复
呵呵应该是的,关注下
我现在用到的也只是简单的线程操作
432423423423 2011-02-25
  • 打赏
  • 举报
回复
看了看任务管理器的总句柄数,每次增加都是5000左右,是不是每次都定义事件的问题啊。

我把关于重叠结构事件都只执行一次,系统的句柄数就不增加了,估计就是这个问题。
432423423423 2011-02-25
  • 打赏
  • 举报
回复
加了上面的语句。还是运行半个小时候,会出现致命的错误。在这期间 while(!Terminated){Synchronize(Receive);}循环了5,6百万次。
单独发送,而关闭接收线程没有问题,一旦接收数据了就会出现上面所述的问题。
432423423423 2011-02-25
  • 打赏
  • 举报
回复
找到问题所在:重叠结构的event事件我一直在创建,但是却没有释放,应该最后加上一句 CloseHandle(m_osRead.hEvent)。
在异步结构里,在执行 ReadFile 或者WriteFile 时, 会自动将 hEvent 置为无信号状态的。
当ReadFile/WriteFile 操作完成后, hEvent 会自动置为有信号的状态。 所以不用ReleaseMutex(m_osRead.hEvent)。



还有一个问题:我在异步模式操作时,我的重叠结构是分别定义为接收和发送两个,还是定义一个啊,因为在接收完成时,会不会触发接收重叠结构的事件啊,这不就乱套了吗?
fall513 2011-02-24
  • 打赏
  • 举报
回复
加上ReleaseMutex(m_osRead.hEvent)试试
通过本课程学习您可以学习到Dart语言如下知识:第1章 Dart语言概述:Dart语言简介、Dart语言支持平台开发、Flutter为什么选择Dart语言。第2章 开发环境搭建:下载Dart SDK、Windows下安装Dart SDK、macOS下安装Dart SDK、Visual Studio Code开发工具、IntelliJ IDEA开发工具。第3章 完成个Dart程序:动动手写一个HelloWorld、Dart源代码文件组织结构、Visual Studio Code调试Dart代码、IntelliJ IDEA调试Dart代码。第4章 Dart语法基础:标识符、关键字、变量、常量、注释、库。第5章 Dart数据类型:数值类型、字符串、数据类型相互转换、布尔类型和枚举类型第6章 运算符:算术运算符、算术赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、类型检查运算符。第7章 控制语句:分支语句、循环语句、跳转语句。第8章 函数:函数声明、可选参数、头等函数(first-class function)、匿名函数。第9章 类:类声明、getter和setter访问器、构造函数、静态变量和静态方法、级联符号。第10章 继承与多态:Dart中的继承实现、调用父类构造函数、成员变量的覆盖(Override)、方法的覆盖(Override)、多态、混入(Mixins)。第11章 抽象类与接口:抽象类、接口、Dart中隐式接口、实现接口。第12章 数据容器:List容器、Set容器、Map容器、泛型。第13章 异常处理:捕获异常、try-on捕获异常、try-catch捕获异常、try-on-catch捕获异常、使用finally代码块、手动抛出异常、自定义异常类。第14章 异步编程:Dart异步处理机制、案例:同步函数实现读取文件、案例:异步函数实现读取文件、Future对象。  

1,314

社区成员

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

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