1、事件
事件是内核对象,多用于线程间通信,可以跨进程同步
2、事件使用
(1)创建事件
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTE SlpEventAttributes,//安全控制,一般直接传入NULL
BOOL bManualReset,//确定事件是手动还是自动
BOOL bInitialState,//事件的初始状态
LPCTSTR lpName//事件的名称
);
(2)打开事件
HANDLE OpenEvent(
DWORD dwDesiredAccess,//表示访问权限
BOOL bInheritHandle, //事件句柄继承性
LPCTSTR lpName //名称
);
(3)触发事件
BOOL SetEvent(HANDL EhEvent);
(4)设置未触发
BOOL ResetEvent(HANDL EhEvent);
3、示例代码
#include <iostream>
#include <Windows.h>
using namespace std;
static int number = 10;
HANDLE event;
DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
cout << "窗口1售票开始"<< endl;
while (1)
{
WaitForSingleObject(event, INFINITE);
if (number > 0)
{
cout << "窗口1售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
SetEvent(event);//设置事件为触发状态
}
return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
cout << "窗口2售票开始" << endl;
while (1)
{
WaitForSingleObject(event, INFINITE);
if (number > 0)
{
cout << "窗口2售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
SetEvent(event);
}
return 0;
}
int main()
{
HANDLE HOne, HTwo;
event = CreateEvent(NULL, FALSE, FALSE, NULL);
SetEvent(event);
HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL);
HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while (TRUE)
{
if (number == 0)
{
cout << "不好意思,票卖完了!" << endl;
CloseHandle(event);
return 0;
}
else
{
continue;
}
}
system("Pause");
return 0;
}