WaitForSingleObject -- setevent 讲解与编程示例

本文详细介绍了Windows API中的WaitForSingleObject与SetEvent函数。WaitForSingleObject用于使线程等待指定对象变为有信号状态,而SetEvent则用于设置事件句柄的状态。文章通过示例代码展示了两个函数如何在多线程环境中协同工作。
摘要由CSDN通过智能技术生成

  函数一直等待,直到指明的 Handle 处于signed 状态,或者超过规定的时间才返回。

  函数原型:

DWORD WINAPI WaitForSingleObject(
  _In_ HANDLE hHandle,
  _In_ DWORD  dwMilliseconds
);

  hHandle[in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。

  dwMilliseconds[in]超时时间间隔,单位为milliseconds(毫秒)。

  WaitForSingleObject函数用来检测 hHandle 事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达 dwMilliseconds 毫秒,但 hHandle 所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。

  当直接或者间接创建窗口的时候,使用这个函数要小心,因为此时 wait 会导致消息阻塞,进一步导致系统死锁。关于这点可见例子

SetEvent 函数原型:

BOOL WINAPI SetEvent(
  _In_ HANDLE hEvent
);

  hEvent 是一个事件的句柄, 通过 CreateEvent 或者 OpenEvent 返回。函数成功返回非0,失败返回0。
  WaitForSingleObject()等待,直到参数所指定的 hHandle 成为发信号状态时才返回,当 OBJECT 是EVENT 的时候就可以通过 SetEvent 让其返回。

  下面是一个小例子:

// wait_for.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <afxmt.h>

CEvent g_event;

void ThreadFunc1(LPVOID pParam)
{
    ::WaitForSingleObject(NULL/*g_event*/,INFINITE);

    for( int i = 0; i < 100; i++ )
    {
        printf("ThreadFunc1:%d\n", i);
    }
}

void ThreadFunc2(LPVOID pParam)
{
    for( int i = 0; i < 5; i++ )
    {
        printf("ThreadFunc2:%d\n", i);
        Sleep(1000);
    }

    g_event.SetEvent();
}

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD m_ThreadID[2];

    g_event.ResetEvent();

    ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc1,NULL,0,&m_ThreadID[0]);
    ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc2,NULL,0,&m_ThreadID[1]);

    getchar();

    return 0;
}

  通过例子可以看出 他们之间是如何交互的,需要注意的是上面测试了一下 WaitForSingleObject 参数句柄为NULL的情况:此时不等待直接返回,而不管第二个参数数值。

无效句柄可见示例

关于 WaitForSingleObject 返回值 参考:
MSDN
关于 SetEvent 可参考:
MSDN

VS2010工程实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值