多线程中, 如何取消其它线程 被挂起的IO/等待 操作?

帐号已注销 2013-03-10 03:14:15
问题是这样的, 我写了个串口收发程序, 总共开了三个线程.

主线程处理UI,另外两个线程分别用于读和写, 多数情况下都能正常工作.

但我在主线程中关闭通信资源的句柄的时候, CloseHandle(有时)会被挂起, 最终导致主线程失去响应.

于是我想用CancelIo来取消, 但CancelIo只能取消调用线程的IO操作.

CancelIoEx可以用于取消其它线程的操作, 但是不适用于WinXP(我的系统是WinXP).

请问要怎么做, 其它线程的等待操作/IO操作才会被取消?

以前我是使非主线程的ReadFile挂起,这样主线程CloseHandle立即返回(ReadFile因为出错而立即返回,我在CloseHandle前设定了一个标记,以判断出错是不是我自己产生的. 以此来结束线程).
后来我换用WaitCommEvent挂起, 这样一来,CloseHandle就不能立即返回了.

这个问题一直困扰着我, 各位一定帮帮忙呀.

...全文
197 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
帐号已注销 2013-03-10
  • 打赏
  • 举报
回复
引用 楼主 vbgkj 的回复:
本帖最后由 vbgkj 于 2013-03-10 03:17:35 编辑 问题是这样的, 我写了个串口收发程序, 总共开了三个线程. 主线程处理UI,另外两个线程分别用于读和写, 多数情况下都能正常工作. 但我在主线程中关闭通信资源的句柄的时候, CloseHandle(有时)会被挂起, 最终导致主线程失去响应. 于……
以说得详细些吗? 我不是要挂起线程, 我是想知道为什么一旦其它线程调用了WaitCommEvent后, 包括但不限于CloseHandle在内的几乎所有对通信句柄的操作都会挂起.
zyyoung 2013-03-10
  • 打赏
  • 举报
回复
挂起线程你可以 用WaitForSingleObject,搭配segament,event

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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