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就可以拿到其他进程的消息句柄;