【转】在主线程中慎用WaitForSingleObject或WaitForMultipleObjects

使用WaitForMultipleObjects时注意的问题 使用WaitForMultipleObjects时注意的问题今天处理了一个客户端控件的BUG。这个控件会创建几个线程,每个线程链接服务器下载数据文件及图片等内容。昨天有用户反映在他机器上不能正常获得下载数据,后来经了解用户使用的是Win2K的操作系统,而我在WinXP上反复测试都没有问题。然后找到一台Win2K的机器进行测试,确实下载存在问题。通过输出log文件调试,发现在一处调用WaitFo 阅读详情

原文:http://www.cnblogs.com/jcss2008/archive/2009/02/23/1396803.html

 

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

线程函数:

DWORD WINAPI ThreadProc(
    
while ( ! bTerminate)
    
{
        
//  从一个链表中读取信息并且插入到CListCtrl中
        
//  CListCtrl的句柄是通过线程参数传递进来的
         for (;;)
       
{
           ReadInfoFromList();
           InsertToCListCtrl();
        }

    }

}

主线程中使用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用下面的代码替换:

while (TRUE)
{

    DWORD result ; 
    MSG msg ; 

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

    
if  (result  ==  (WAIT_OBJECT_0))
    
{
        
break ;
    }
 
    
else  
    
{ 
        PeekMessage(
& msg, NULL,  0 ,  0 , PM_REMOVE);
        DispatchMessage(
& msg); 
    }
 
}


总结:
如果在工作线程中有可能涉及到了消息驱动的API,那么不能在主线程中使用WaitForSingleObject一类函数,而必须使用上述的方案。

关于MsgWaitForMultipleObjects 的使用[主线程中WaitForSingleObject/WaitForMultipleObjects的替代方案] 在这两天的工作中,遇到了一个问题,在主进程中通过 CreateProcess 打开另外一个进程,然后使用 WaitForSingleObject 来进行调用进程的阻塞,等待被调用进程的返回,但是在被调用进程运行期间,如果对调用进程操作,将会出现一些奇怪的现象,就像是所有在开启子进程时的各种事件全部被快速地执行了。如下图 Demo 所示: 这是由于 WaitForSingleObject 阻塞... 阅读详情

相关推荐

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3228

在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?线程函数: DWORDWINAPIThreadProc(while(!bTerminate){//从一个链表中读取信息并且插入到CListCtrl中//CListCtrl的句柄是通过线程参数传递进来的for(;;){Read...

weixin_30896511的博客 281

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

本文介绍了在Android设备上通过Termux部署OpenClaw AI助理的方案。Android设备的便携性、Termux提供的完整Linux环境以及多样化的硬件配置使其成为理想的部署平台。文章详细分析了不同级别Android设备的硬件规格(从入门级到旗舰级),并提供了最低/推荐配置要求。部署步骤包括Termux安装初始化、Python环境配置以及性能优化建议。该方案充分利用Android设备的传感器和电池供电优势,为移动办公、学习等场景提供了低成本、高便携性的AI助理解决方案。

博客 3009

VC++关于使用WaitForSingleObject等待线程安全退出,出现死机问题的解决

1、MFC项目场景如下: 主线程新建了子线程: CWinThread *m_pThread_SysReset; m_pThread_SysReset=AfxBeginThread(ThreadSysResetthis); 主界面等待子线程退出时,主线程主动调用了函数: WaitForSingleObject(m_pThread_SysReset->m_hThread, INFIN...

$firecat利白的代码足迹$ 6262

i茅台最新任务python脚本

从固定的 `header_context` 生成HTTP请求头,并加入用户的`userId`、`MT-Token`等动态信息,以模仿真实的请求。- 发送预约请求,提交商品和门店的参数,如 `sessionId`、`shopId`、`itemId` 等。- 定时任务:通过 `cron` 表达式 `0 0 9/21 * * *`,表示每月的9日和21日的0点执行。- `login`:使用验证码进行登录,并返回 `token` 和 `userId`。- 获取北京时间当天0点的时间戳,作为预约请求的时间参数。

三维点云技术探索 980

基于GA-PSO-BP混合神经网络的多输入多输出数据预测-Python代码实现

多输入多输出数据预测

2301_80449389的博客 2783

WaitForSingleObject等待函数

等待函数使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程是不会进入等待状态的。最常用是WaitForSingleObject。);参数1:用来标识要等待的内核对象,这个内核对象可以处于触发状态或未触发状态。参数2:用来指定线程最多愿意花多长的时间来等待对象被触发(超时时间,单位为毫秒)如果指定了一个非0值,则该函数将等待,直到该对象被触发或时间间隔过去。如果为0,如果对象没有触发,函数不会进入等待状态,它总是立即返回。...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 5834

CloudCompare 二次开发(9)——半径滤波

基于PCL对CloudCompare软件进行二次开发,实现的算法功能是半径滤波

点云侠的博客 1399

主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

主线程中慎用WaitForSingleObject (WaitForMultipleObjects) 下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗? 线程函数: DWORD WINAPI ThreadProc( while(!bTerminate) { // 从一个链表中读取信息并且插入到CListCtrl中 // C...

《好好先生》专栏 496

【前端基础篇】HTML5 + CSS3 入门知识

,HTML5和CSS3核心知识

前端知识分享喵 2982

安装keil软件时安装不了芯片包怎么回事?芯片包安装路径放在Keill里的packs下面,弹框提示报错:Errors retumned from cpackget...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2206

等待线程WaitForSingleObject、WaitForMultipleObjects

等待线程WaitForSingleObject()、WaitForMultipleObjects() 在多线程下面,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。 那么,什么是信...

寂蝶难双,窃窃思羽. 4731

CANFD加速是什么?和CANFD有什么区别?

在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么区别呢?刚接触CANFD小伙伴肯定一脸懵,本篇主要是给大家分享一下他们的区别,如果对你有帮助,请转发,收藏,点赞💐🎉👍😊

汽车电子软件领域知识分享 1025

WaitForSingleObject与waitForMultipleObjects

这两个函数都是等待函数,等待函数可以使进程主动进入等待状态,直到某个内核对象变成已通知状态或者超时。 WaitForSingleObject的函数原型是: DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMillisecond)hObject 是一个可以被通知的内核对象,以句柄的形式传递,dwMillisecond是超时的时间。这个函数的返回

长颈鹿先生的专栏 1351

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

windows中的WaitForSingleObject和WaitForMultipleObjects

 The WaitForSingleObject function checks the current state of the specified object. If the objects state is nonsignaled, the calling thread enters the wait state. It uses no processor time while wait

cnctloveyu的专栏 2517

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WaitForSingleObject和WaitForMultipleObjects使用详解

WaitForSingleObject的用法DWORD WaitForSingleObject(  HANDLE hHandle,  DWORD dwMilliseconds);参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状

vieri122的专栏 917

简单介绍WaitForSingleObject / WaitForMultipleObjects

1、WaitForSingleObject()函数原型 : DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);简单示例代码: //利用信号量来管理线程池 大致代码如下 HANDLE h_semaphore = CreateSemaphore(NULL, 0, m_thread_pool_size, NULL); DW...

weixin_34354173的博客 296

关于 CreateEvent 和WaitForMultipleObjects以及 WaitForSingleObject 等函数的使用实例

1   创建时间句柄:CreateEvent  HANDLE  H_Event[2];  HANDLE  HSignal;  H_Event[0] = ::CreateEvent(NULL,TRUE,FALSE,NULL);   H_Event[1] = ::CreateEvent(NULL,FALSE,FALSE,NULL); HSignal =  ::CreateEvent(NULL

mrailence的博客 1753
上一篇: 【转】WinPcap 常见安装和运行错误
下一篇: 【转】VC限制窗口大小
code09
博客等级 码龄18年 31粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值