一、概念
创建事件:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL
BOOL bManualReset, // 手动/自动
// TRUE:表示手动,在WaitForSingleObject后必须手动调用ResetEvent清除信号
// FALSE:表示自动,在WaitForSingleObject后,系统自动清除事件信号
BOOL bInitialState, //初始状态,FALSE为无信号,TRUE为有信号
LPCTSTR lpName //事件的名称
);
SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。
可使用WaitForSingleObject或者WaitForMultipleObjects来等待事件。
二、代码实例
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
HANDLE h_event1 = NULL;
HANDLE h_event2 = NULL;
DWORD WINAPI FunProc1(LPVOID lpParameter);
DWORD WINAPI FunProc2(LPVOID lpParameter);
DWORD WINAPI FunProc1(LPVOID lpParameter)
{
cout << "线程1开始运行。\n" << endl;
while (WAIT_OBJECT_0 != WaitForSingleObject(h_event1, 300))
{
cout << "线程1正在等待event1\n" << endl;
}
cout << "线程1等到了event1,线程1结束。\n" << endl;
ResetEvent(h_event1);
return 0;
}
DWORD WINAPI FunProc2(LPVOID lpParameter)
{
cout << "线程2开始运行。\n" << endl;
while (WAIT_OBJECT_0 != WaitForSingleObject(h_event2, 300))
{
cout << "线程2正在等待event2\n" << endl;
}
cout << "线程2等到了event2,线程2结束。\n" << endl;
Sleep(350);
SetEvent(h_event1);
return 0;
}
int main(int argc, char** argv)
{
h_event1 = CreateEvent(NULL, true, false, _T("event_one"));
h_event2 = CreateEvent(NULL, false, false, _T("event_two"));
HANDLE hThread1;
hThread1 = CreateThread(NULL, 0, FunProc1, NULL, 0, NULL);
HANDLE hThread2;
hThread2 = CreateThread(NULL, 0, FunProc2, NULL, 0, NULL);
Sleep(1000);
SetEvent(h_event2);
while (WaitForSingleObject(hThread1, 150) != WAIT_OBJECT_0 || WaitForSingleObject(hThread2, 150) != WAIT_OBJECT_0)
{
cout << "线程还没有结束,主程序等了150ms。\n" << endl;
}
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(h_event1);
CloseHandle(h_event2);
system("pause");
}
在主函数中,创建了两个事件对象,h_event1与h_event2;其中h_event1第二个参数为true,表示其在WaitForSingleObject后必须手动调用ResetEvent清除信号,h_event1第二个参数为false,表示其在WaitForSingleObject后系统自动清除事件信号,两个事件对象创建时第三个参数都为false,表示初始都为无信号状态;
接下来启动两个线程,第一个线程的线程函数中每隔300ms查询一次h_event1的状态,直到h_event1为有信号停止,并将h_event1置为无信号状态;第一个线程的线程函数中每隔300ms查询一次h_event2的状态,直到h_event2为有信号停止,并在h_event2有信号之后在等待350ms之后将h_event1置为有信号状态;
主函数在启动两个线程之后等待1秒之后将h_event2置为有信号状态,此时两个线程都应已查询三次信号量状态并将等待情况输出,在h_event2有信号之后线程2会结束,并在等待350ms将事件1修改,在此期间线程1会再次查询,同时主函数会继续执行,再while循环中查询两个线程的状态,当两个并未都结束时每隔150ms输出一次信息。
最后程序运行结果:
这个例子代码其实写的很蠢,但应该比较容易看明白,写这篇文主要是因为我自己在网上查事件使用的时候,搜到的文章全是概念解释,偶尔有个例子也不详细,就自己随便写个记录一下。。。。