我用API做了个异步串口通讯的工具。开了一个线程CommThread(LPVOID pParam)来处理数据,在线程里面先用WaitForMultipleObjects来等待事件,等到读数据的事件后,然后在使用一个循环,在里面读数据。
但是现在的问题是如果在读数据的时候程序退出,就会出现异常,在其他时候,比如说数据没有到来的时候退出就没有问题,请问这个问题应该怎么解决????谢谢

解决方案 »

  1.   

    要用事件,你在主线程里创建一个事件,然后传给线程,主线程在退出时,对这个事件SetEvent,串口线程收到这个事件后,自己从容退出。
      

  2.   

    是啊,我是这样做的,在使用WaitForMultipleObjects等待事件中,就设置了退出的事件,但是当在读数据的时候退出,就响应不到这个事件就直接退出了,其他情况的时候:比如没有数据读取的时候就可以收到退出事件的响应,然后关闭线程
      

  3.   

    读数据的ReadFile关联了事件,在WaitForMultipleObjects做循环等待,但是数据在读取的时候退出程序,就会出现异常???WaitForMultipleObjects收不到退出的事件????
      

  4.   

    可能是主线程退出的太快,线程虽然收到事件,但还没完全退出时主线就结束了。
    你确定线程没有收到事件?
    你在主线程里sleep一下试试。
      

  5.   

    主线程退出前,SetEvent之后,添加子线程已经退出的确认代码。
      

  6.   

    zaodt说的对的,就是这种情况,应该是按照yang79tao说的方法解决,Sleep应该是一个解决的方法,请问还有没有其他的方法????
      

  7.   

    我想,应该这样做:建立两个事件对象1、在 Work Thread 中判断一个事件对象,只有当主线程要求 Work Thread 退出时该事件对象才会有效,也就是说这个事件对象的主动权在主线程;2、在主线程中,当将上边那个事件对象置为有效时,调用 WaitForSingleObject 函数开始监视第二个事件对象,这个事件对象的主动权在 Work Thread 手中,只有 Work Thread 处理完所有的操作后才置为有效,然后线程也退出了。楼主试试看,有效果记得来说说。
      

  8.   

    我就是这样做的,没有用,当在读取数据时退出,WaitForSingleObject根本不会收到第2个事件对象就退出了,我的接收是用的是循环接收一个接收BUFFER的内容,每次接收一个字节(因为不知道接收Buffer具体有多少字节),判断当接收BUFFER为空后才退出循环的!!!!
      

  9.   


    那你在主线程中的 WaitForSingleObject 函数的第二个参数用的是什么?是 INFINITE 吗?如果是 INFINITE 的话,主线程应该不会立即退出,它要等事件对象有效才会退出。