WaitForSingleObject和CEvent用法

函数定义:

DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);

hHandle 是待处理线程的句柄
dwMilliseconds 是返回等待的时间

WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。

CEvent 类提供了对事件的支持。事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象。例如在某些网络应用程序中,一个线程(记为A)负责监听通讯端口,另外一个线程(记为B)负责更新用户数据。通过使用CEvent 类,线程A可以通知线程B何时更新用户数据。每一个CEvent 对象可以有两种状态:有信号状态和无信号状态。线程监视位于其中的CEvent 类对象的状态,并在相应的时候采取相应的操作。
在MFC中,CEvent 类对象有两种类型:人工事件和自动事件。一个自动CEvent 对象在被至少一个线程释放后会自动返回到无信号状态;而人工事件对象获得信号后,释放可利用线程,但直到调用成员函数ReSetEvent()才将其设置为无信号状态。在创建CEvent 类的对象时,默认创建的是自动事件
CEvent 类的各成员函数的原型和参数说明如下:

CEvent(BOOL bInitiallyOwn=FALSE, BOOL bManualReset=FALSE, LPCTSTR lpszName=NULL, LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);
  1. bInitiallyOwn:指定事件对象初始化状态,TRUE为有信号,FALSE为无信号;
  2. bManualReset:指定要创建的事件是属于人工事件还是自动事件。TRUE为人工事件,FALSE为自动事件;
  3. 后两个参数一般设为NULL,在此不作过多说明
BOOL CEvent::SetEvent();

将 CEvent 类对象的状态设置为有信号状态。如果事件是人工事件,则 CEvent 类对象保持为有信号状态,直到调用成员函数ResetEvent()将其重新设为无信号状态时为止。如果CEvent 类对象为自动事件,则在SetEvent()将事件设置为有信号状态后,CEvent 类对象由系统自动重置为无信号状态。
如果该函数执行成功,则返回非零值,否则返回零

BOOL CEvent::ResetEvent();

该函数将事件的状态设置为无信号状态,并保持该状态直至SetEvent()被调用时为止。由于自动事件是由系统自动重置,故自动事件不需要调用该函数。如果该函数执行成功,返回非零值,否则返回零。我们一般通过调用WaitForSingleObject函数来监视事件状态

注:
CEvent事件的使用需要以下条件:

  1. 工程属性中将“在共享DLL中使用MFC”
  2. 包含头文件
//以下是使用例程:

#include <iostream>
#include <process.h>
#include <afxmt.h>

using namespace std;

static void __cdecl feature_operate( void* pThis);

CEvent g_event;  // 定义全局事件

int _tmain(int argc, _TCHAR* argv[])
{
          _beginthread(feature_operate,NULL,NULL); // 新建线程
          cout<< "now we begin the main task!" <<endl;
           while(true )
          {
                   g_event.SetEvent(); // 激活标志位
                   Sleep(100); // 等待新线程响应
          }
           return 0;
}

static void __cdecl feature_operate( void* pThis)
{
          cout<< "\n new thread begin!"<<endl;
           while( true )
          {
                   WaitForSingleObject(g_event,INFINITE); // 等待事件发生
                   cout<< "now we begin another task!" <<endl;
          }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值