1 事件
通知的作用,当收到事件时,线程可以执行.否则,线程将等候事件发生.,事件只有0无信号和1有信号两种状态
2 事件的用法
2.1 创建事件
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
//安全属性
BOOL bManualReset,//重置方式
BOOL bInitialState, //初始化状态
LPCTSTR lpName //名称
);
返回创建好的事件句柄
bManualReset - 事件重置方式, TRUE
手动和FALSE自动重置. 如果为FALSE,
系统在等候到事件后,会自动将事件
重置为无信号状态. 如果为TRUE,我们
必须自己使用ResetEvent重置状态.
bInitialState - 初始化状态, TRUE为
有信号,FALSE无信号.
2.2 等候事件
WaitForSingleObject/WaitForMultipleObjects
2.3 触发事件
//事件置为1有信号
BOOL SetEvent(
HANDLE hEvent //事件句柄
);
2.4 关闭事件
CloseHandle2.5 重置事件
//事件置为0无信号
BOOL ResetEvent(
HANDLE hEvent //事件句柄);
2.6 其他函数
OpenEventPulseEvent
// Event.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "conio.h"
#include "windows.h"
HANDLE g_hEvent = NULL;
HANDLE g_hEvent2= NULL;
DWORD WINAPI ThreadSend( LPVOID pParam )
{
while( 1 )
{ //触发事件(置为有信号)
SetEvent( g_hEvent );
Sleep( 500 );
SetEvent( g_hEvent2 );
Sleep( 500 );
}
return 0;
}
DWORD WINAPI ThreadRecv( LPVOID pParam )
{
while( 1 )
{ //等候事件通知,此事件等待到之后自动置为无信号
WaitForSingleObject( g_hEvent,
INFINITE );
printf( "Hello Event: %p\n",
g_hEvent );
}
return 0;
}
DWORD WINAPI ThreadRecv2( LPVOID pParam )
{
while( 1 )
{ //等候事件通知
WaitForSingleObject( g_hEvent2,
INFINITE );
printf( "Hello Event2: %p\n",
g_hEvent2 );
ResetEvent( g_hEvent2 );//置为无信号
}
return 0;
}
void Create( )
{
DWORD nThreadID = 0;
HANDLE hThread[3] = { NULL };
hThread[0] = CreateThread( NULL, 0,
ThreadSend, NULL, 0, &nThreadID );
hThread[1] = CreateThread( NULL, 0,
ThreadRecv, NULL, 0, &nThreadID );
hThread[2] = CreateThread( NULL, 0,
ThreadRecv2, NULL, 0, &nThreadID );
}
int main(int argc, char* argv[])
{
//创建自动重置事件
g_hEvent = CreateEvent( NULL,
FALSE, FALSE, NULL );
//创建手动重置事件
g_hEvent2 = CreateEvent( NULL,
TRUE, FALSE, NULL );
Create( );
getch( );
//关闭事件
CloseHandle( g_hEvent );
return 0;
}