WaitForSingleObject的问题
最近在Windows Mobile 上使用基于SmartDevice的ActiveX的时候,遇到了一些问题,就是执行一个简简单单的启动程序的函数,如ShellExecuteEx... 就会导致机器死机。关于这个问题,后来,发现是由于WaitForSingleObject函数导致。
下面就介绍一下WaitForSingleObject函数的使用:
WaitForSingleObject
当指定的对象处于有信号状态或者等待时间结束的状态时,此函数返回。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
参数:
hHandle:指定对象或事件的句柄;
dwMilliseconds: 等待时间,以毫妙为单位,当超过等待时间时,此函数将返回。如果该参数设置为0,则该函数立即返回,如果设置为INFINITE,则该函数直到有信号才返回。
返回值:
如果此函数成功,该函数的返回之标识了引起该函数返回的事件。返回值如下:
WAIT_ABANDONED(0x00000080L)
指定的对象是一个互斥对象,该对象没有被拥有该对象的线程在线程结束前释放。互斥对象的所有权被同意授予调用该函数的线程。互斥对象被设置成为无信号状态。
WAIT_OBJECT_0 (0x00000000L)
指定的对象出有有信号状态。
WAIT_TIMEOUT (0x00000102L)
超过等待时间,指定的对象处于无信号状态
如果失败,返回 WAIT_FAILED;
备注:
此函数检查指定的对象或事件的状态,如果该对象处于无信号状态,则调用线程处于等待状态,此时该线程不消耗CPU时间
一些需要注意的问题:
线程函数:
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一类函数,而必须使用上述的方案。
我们的ActiveX中同样是这样的问题导致:
分享到:
相关推荐
线程中CreateEvent和SetEvent及WaitForSingleObject的用法
WaitForSingleObject演示、Window信号用法演示
多线程 启动控制台 精确定时 WaitForSingleObject
WaitForSingleObject的用法
WaitForSingleObject和CEvent的结合用法示例 VC6控制台工程 多线程控制
让程序关不掉. WaitForSingleObject 的使用.
测试WaitForSingleObject,CreateEvent SetEvent,vs2008实现
面对用户模式下的问题与不足,我们来分析一下内核模式下的线程同步,通过使用ProcessExplorer工具分析,得到当一个句柄被调用多次时,前面的句柄(你可以kill 之前的那些个线程)等待函数将失效,程序只处理最新的那个等待...
[Delphi]多线程编程(9)认识等待函数WaitForSingleObject[归类].pdf
如果使用CreateProcess()而不是ShellExecuteEx()并在后台运行Update.exe,则可以更好地控制正在创建的新进程。 SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL;...
WaitForSingleObject(HANDLE full,INFINITE); 释放资源 ReleaseSemaphore( __in HANDLE hSemaphore,// hSemaphore是要增加的信号量句柄 __in LONG lReleaseCount,// lReleaseCount是增加的计数。 __out_opt...
使用WaitForSingleObject()在"mytime”命令和新创建的进程之间同步 调用GetSystemTime()来获取时间 在Linux下实现: 使用fork()/exec()来创建进程运行程序 使用wait()等待新创建的进程结束 调用gettimeofday()来获取...
哲学家就餐问题(整理)的几个总结WaitForSingleObject(mutex, INFINITE); cout ; ReleaseMutex(mutex); //初始状态为THINKING mystate = THINKING; leftFork = (myid) % PHILOSOPHER_NUM; rightFork = (myid...
利用WaitForSingleObject等待句柄失效。 用 精易模块 的进程_打开1(进程Id)可以得到进程句柄。 然后调用 WaitForSingleObject(进程句柄,等待时间) 等待时间 如果是-1就是无限等待。
多种方法实现VC串口通信,综述和例子,简单实用
生产者消费者问题 while(1) { WaitForSingleObject(hMutex,INFINITE); if(count==BufferSize){ //缓冲区满 ReleaseMutex(hMutex); //等待直到缓冲区非满 WaitForSingleObject(hNotFullEvent,INFINITE); ...
FindFirstChangeNotification;WaitForSingleObject
WResult:=WaitForSingleObject(HMutex,INFINITE); //WaitForSingleObject函数来等待一个内核对象变为已通知状态: {DWORD WaitForSingleObject( HANDLE hObject, //指明一个内核对象的句柄 DWORD ...
进程的同步 1 实验目的和要求 目的:理解进程同步的原理和意义,掌握信号量的实现方法和应用。 要求: (1)使用EOS的信号量,实现生产...WaitForSingleObject与ReleaseMutex、ReleaseSemaphore函数相当于P、V原语。