51Halcon机器视觉

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,微信登录

查看: 1332|回复: 0

[资料] 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

[复制链接]
  • TA的每日心情
    点赞
    前天 00:10
  • 签到天数: 955 天

    连续签到: 1 天

    [LV.10]以坛为家III

    379

    主题

    1552

    帖子

    7286

    积分

    Rank: 9

    积分
    7286

    突出贡献优秀版主荣誉管理论坛元老切换助手验证会员最佳新人

    发表于 2015-6-25 23:42:08 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?

    线程函数:
    1. DWORD WINAPI ThreadProc(
    2.     while(!bTerminate)
    3.     {
    4.         // 从一个链表中读取信息并且插入到CListCtrl中
    5.         // CListCtrl的句柄是通过线程参数传递进来的
    6.         for(;;)
    7.        {
    8.            ReadInfoFromList();
    9.            InsertToCListCtrl();
    10.         }
    11.     }
    12. }
    复制代码
    主线程中使用CreateThread启动线程。

    当想终止子线程时,在主线程中:
    bTerminate = TRUE;
    WaitForSingleObject(threadHandle, INFINITE);
    可是,以运行到WaitForSingleObject,子线程就Crash了。

    为什么呢?

    问题原因:
    后来我终于在InsertItem的反汇编中发现了如下的代码
    call dword ptr [__imp__SendMessageA@16 (7C141B54h)]
    可见,InsertItem是必须借助消息循环来完成任务的。如果我们在主线程中WaitForSingleObject了,必然导致主线程阻塞,也就导致了消息循环的阻塞,最终导致工作线程Crash掉了*_*

    解决方案:
    为了解决在主线程中Wait的问题,微软专门设计了一个函数MsgWaitForMultipleObjects,这个函数即可以等待信号(thread,event,mutex等等),也可以等待消息(MSG)。即不论有信号被激发或者有消息到来,此函数都可以返回。呵呵,那么我的解决办法也就出来了。
    将上面的WaitForSingleObject用下面的代码替换:
    1. while(TRUE)
    2. {

    3.     DWORD result ;
    4.     MSG msg ;

    5.     result = MsgWaitForMultipleObjects(1, &readThreadHandle,
    6.         FALSE, INFINITE, QS_ALLINPUT);

    7.     if (result == (WAIT_OBJECT_0))
    8.     {
    9.         break;
    10.     }
    11.     else
    12.     {
    13.         PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
    14.         DispatchMessage(&msg);
    15.     }
    16. }
    复制代码
    总结:
    如果在工作线程中有可能涉及到了消息驱动的API,那么不能在主线程中使用WaitForSingleObject一类函数,而必须使用上述的方案。



    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站

    51Halcon会员技术交流会员技术交流 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用

    有问题需要咨询站长?| 申请友链| 小黑屋| 手机版| Archiver|  

    粤ICP备15095995号-2 粤公网安备44030602000670号

    CopyRight © 2015-2020 51Halcon机器视觉. Tencent Cloud X3.4.

    快速回复 返回顶部 返回列表