`
guowee
  • 浏览: 176737 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

WaitForSingleObject 的问题

阅读更多

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中同样是这样的问题导致:

 

分享到:
评论

相关推荐

    WaitForSingleObject和CEvent的结合用法示例

    6. **线程同步**:`WaitForSingleObject`和`CEvent`的结合使用确保了线程间的同步,防止了数据竞争和其他并发问题。例如,在生产者线程写入数据后,消费者线程才能安全地读取。 在这个示例项目中,`...

    WaitForSingleObject演示、Window信号用法演示

    这些原语配合`WaitForSingleObject`,能够实现复杂线程同步策略,如生产者-消费者模型、读者-写者问题等经典并发问题的解决方案。 通过`SignalDemo`的实践,我们可以深入理解`WaitForSingleObject`的工作原理,以及...

    多线程 启动控制台 精确定时 WaitForSingleObject

    然而,多线程也带来了同步和互斥的问题,需要妥善管理共享资源,防止数据竞争和死锁。 **启动控制台**通常指的是在操作系统中打开一个命令行界面,用于接收用户输入和显示程序输出。在Windows上,可以通过创建一个...

    桌面\关于WaitForSingleObject实例分析

    ### 桌面关于`WaitForSingleObject`实例分析 #### 同步机制概述 同步是多线程编程中的一项关键技术,它确保了共享资源在并发环境中的正确访问,从而避免了诸如竞态条件等问题的发生。同步机制可以分为两种基本类型...

    [Delphi]多线程编程(9)认识等待函数WaitForSingleObject[归类].pdf

    "Delphi多线程编程之等待函数WaitForSingleObject" 在Delphi多线程编程中,等待函数WaitForSingleObject是一个非常重要的函数,它允许一个线程等待另一个线程或进程的结束,然后继续执行自己的代码。...

    线程中CreateEvent和SetEvent及WaitForSingleObject的用法

    ### 线程中CreateEvent和SetEvent及WaitForSingleObject的用法 #### CreateEvent函数详解 **CreateEvent** 函数主要用于创建或打开一个命名的或无名的事件对象。事件对象通常用于同步线程之间的操作,例如,用于...

    测试WaitForSingleObject

    这个函数在创建多线程应用时非常有用,可以避免竞态条件和死锁等问题。现在我们来深入探讨`WaitForSingleObject`以及与之相关的`CreateEvent`和`SetEvent`函数。 `WaitForSingleObject`函数的作用是挂起当前线程,...

    WaitForSingleObject的用法

    这个函数能够有效解决程序中的一些同步问题,尤其是在需要确保某些操作按顺序执行的情况下。 #### 三、函数原型及参数说明 ```cpp DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); ``` **...

    WaitForSingleObject,CreateThread

    `WaitForSingleObject`和`CreateThread`是Windows API中的两个重要函数,它们在处理线程同步和控制流程方面发挥着重要作用。 `CreateThread`函数用于在进程中创建一个新的线程。这个函数允许程序员并行执行代码,...

    返回时,使用shellexecuteex和waitforsingleobject父窗口失去焦点

    如果使用CreateProcess()而不是ShellExecuteEx()并在后台运行Update.exe,则可以更好地控制正在创建的新进程。 SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL;...

    VC++ .声音文件播放演示 实例

    5. **错误处理**: 当播放声音时,可能会遇到文件找不到、格式不支持等问题,因此需要对`PlaySound()`的返回值进行检查,如果返回`NULL`,则意味着播放失败,可以通过`GetLastError()`获取具体的错误信息。...

    进程同步实验代码 图书馆 ,登记,注册使用 CreateMutex,WaitForSingleObject

    WaitForSingleObject(HANDLE full,INFINITE); 释放资源 ReleaseSemaphore( __in HANDLE hSemaphore,// hSemaphore是要增加的信号量句柄 __in LONG lReleaseCount,// lReleaseCount是增加的计数。 __out_opt...

    windows进程控制mttime

    使用WaitForSingleObject()在"mytime”命令和新创建的进程之间同步 调用GetSystemTime()来获取时间 在Linux下实现: 使用fork()/exec()来创建进程运行程序 使用wait()等待新创建的进程结束 调用gettimeofday()来获取...

    IPC读者写者和睡眠理发师问题

    《读者写者问题与睡眠理发师问题:Windows平台下的实现》 在计算机系统中,进程间的通信(IPC,Inter-Process Communication)是一个重要的概念,它允许不同进程间共享数据和资源,以协同完成复杂的任务。本文将...

    读者写者问题的Windows下编程

    ### 读者写者问题的Windows下编程 #### 知识点概述 本文旨在探讨“读者写者问题”在Windows下的编程实现方式,并基于一个特定的资料来源——豆丁网上的一篇文档,该文档以图片形式呈现,无法直接复制文本内容。...

    操作系统读者写者问题

    在实现读者优先和写者优先的读者-写者问题时,需要使用Windows API中的CreateThread、ExitThread、Sleep、WaitForSingleObject和CreateSemaphore等函数。CreateThread函数用于创建线程,ExitThread函数用于结束当前...

    操作系统OS报告读者与写者问题(进程同步问题).pdf

    在Windows API中,CreateThread函数用于创建线程,ExitThread函数用于结束当前线程,Sleep函数用于挂起当前线程,WaitForSingleObject函数用于等待指定对象的可用状态,CreateSemaphore函数用于创建信号量,...

    c++实现生产者消费者问题

    "C++实现生产者消费者问题" 在计算机科学中,生产者消费者问题是指在多线程或多进程环境下,如何安全地访问共享资源的问题。这是一个经典的同步与互斥问题,旨在解决生产者和消费者之间的数据交换问题。在这个问题...

    操作系统:生产者和消费者之吃水果问题

    根据给定的信息,我们可以将这个“吃水果问题”视为一种典型的生产者-消费者问题的变体,该问题在操作系统领域中被广泛讨论。下面我们详细分析这个问题,并解释其中涉及的关键概念和技术。 ### 操作系统中的生产者-...

Global site tag (gtag.js) - Google Analytics