关于C++ Event、CreateEvent、ResetEvent、SetEvent、WaitForSingleObject

C++中的Event

1、创建一个Event

HANDLE mEvent = CreateEvent(NULL,FALSE,TRUE,TEXT("Demo"));

看看构造函数

CreateEventW(
    __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,  //一般会为NULL
    __in     BOOL bManualReset,                        //是否在使用完成后自动恢复可用状态
    __in     BOOL bInitialState,                       //初始化时指定是否为可用状态
    __in_opt LPCWSTR lpName                            //事件名
    );

2、怎么使用

第一段:

int main(void){

	HANDLE mEvent = CreateEvent(NULL,FALSE,TRUE,TEXT("Demo"));
	while(true){
		WaitForSingleObject(mEvent,INFINITE);
		cout << "有信号" << endl;
	}
	system("pause");
	return 0;
}

Event初始化为:不自动恢复为可用状态、初始化为可用状态;

那打印结果就很简单了:

注意:WaitForSingleObject,是等待指定Event处于可用状态才往下执行

第二个参数是指定等待时间,比如我把第二个参数设置为300,是以毫秒为单位,那么如果在300毫秒结束后,Event还是不可用,线程还是会往下执行;

很明显,第一次初始化的时候我置为可用状态,第三个参数为TRUE;

但是我又指定第二个对象为FALSE,即使用过后不自动恢复为可用状态,所以在执行第二遍循环的时候,就执行不下去了,处于等待状态。

第二段:

int main(void){

	HANDLE mEvent = CreateEvent(NULL,true,TRUE,TEXT("Demo"));
	while(true){
		WaitForSingleObject(mEvent,INFINITE);
		cout << "有信号" << endl;
	}
	system("pause");
	return 0;
}

我只是把创建Event的第二个参数设置为true

结果就是无限循环打印:

明白第二个参数的意思了吗?显而易见

第三段:加入ResetEvent()和SetEvent()

SetEvent就是把Event设置为可用状态;

ResetEvent就是把Event设置为不可用状态;

int main(void){

	HANDLE mEvent = CreateEvent(NULL,TRUE,TRUE,TEXT("Demo"));
	ResetEvent(mEvent);
	while(true){
		WaitForSingleObject(mEvent,INFINITE);
		cout << "有信号" << endl;
	}
	system("pause");
	return 0;
}

Event默认初始化为自动恢复可用状态,默认为可用状态;

然后用ReSetEvent(mEvent),设置为不可用状态,所以是看不到打印的;

再看看SetEvent

int main(void){

	HANDLE mEvent = CreateEvent(NULL,FALSE,TRUE,TEXT("Demo"));
	while(true){
		WaitForSingleObject(mEvent,INFINITE);
		cout << "有信号" << endl;
		SetEvent(mEvent);
	}
	system("pause");
	return 0;
}

我初始化事件为不自动恢复可用状态,默认为可用状态;

通过上面介绍可以知道,设置为不自动恢复可用状态,在进行一次循环后,消息将不可用;

所以我使用了SetEvent来对事件设置;结果也必将看到无限循环打印;

第四段:Event可以被其他进程获取

HANDLE mEvent2 = OpenEvent(EVENT_ALL_ACCESS,NULL,TEXT("Demo2"));

假设其他进程有一个叫Demo2的消息名,那么通过OpenEvent就可以拿到其他进程的消息句柄;

猜你喜欢

转载自blog.csdn.net/dong923700243/article/details/85714277