1、HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPTSTR lpName
); 创建新的事件对象,返回其句柄
lpEventAttributes: 构造体SECURITY_ATTRIBUTES的指针,表示新创建的事件对象的安全属性。如果为NULL时表示为默认安全属性。
bManualReset:创建的事件对象是否为人工重置还是自动重置,true为人工重置;false为自动重置。
bInitialState: true为事件对象的初始化为有信号状态,false为事件对象初始化为无信号状态。
lpName: 事件对象的名称,如为NULL则是匿名事件。
2、BOOL SetEvent(HANDLE hEvent); 将一个事件对象设为有信号状态。
hEvent: 需要进行设置的事件对象的句柄。
3、BOOL ResetEvent(HANDLE hEvent); 讲一个事件对象设为无信号状态。
hEvent: 需要进行设置的事件对象的句柄。
4、DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);等待具体事件的发生,即事件对象转为有信号状态
hHandle:所等待的事件对象的句柄
dwMilliseconds:等待时间长短,值为时INFINITE为永久等待。
1 #include <cstdio>
2 #include <windows.h>
3
4 using namespace std;
5
6 DWORD WINAPI myfun1(LPVOID lpParameter);
7 DWORD WINAPI myfun2(LPVOID lpParameter);
8
9 HANDLE hevent;
10 int a = 0;
11
12 int main()
13 {
14 hevent = ::CreateEvent(NULL, FALSE, true, NULL);
15 HANDLE h1, h2;
16 h1 = ::CreateThread(NULL, 0, myfun1, NULL, 0, NULL);
17 printf("线程1开始运行!!\n");
18 h2 = ::CreateThread(NULL, 0, myfun2, NULL, 0, NULL);
19 printf("线程2开始运行!!\n");
20 ::Sleep(1000);
21 ::CloseHandle(h1);
22 ::CloseHandle(h2);
23 return 0;
24 }
25
26 DWORD WINAPI myfun1(LPVOID lpParameter)
27 {
28 while(1)
29 {
30 ::WaitForSingleObject(hevent, INFINITE);
31 ::ResetEvent(hevent);
32 ++a;
33 printf("线程1正在运行:%d\n", a);
34 ::SetEvent(hevent);
35 ::Sleep(100);
36 }
37 return 0;
38 }
39
40 DWORD WINAPI myfun2(LPVOID lpParameter)
41 {
42 while(1)
43 {
44 ::WaitForSingleObject(hevent, INFINITE);
45 ::ResetEvent(hevent);
46 ++a;
47 printf("线程2正在运行:%d\n", a);
48 ::SetEvent(hevent);
49 ::Sleep(100);
50 }
51 return 0;
52 }