windows多线程同步机制---事件
2016-02-17 20:19
375 查看
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;
}
相关文章推荐
- apache mpm
- jQuery中的常用事件总结
- C#实现WinForm捕获最小化事件的方法
- c#事件使用示例详解
- C#中的事件介绍
- C#实现自定义双击事件
- extjs 为某个事件设置拦截器
- jQuery阻止同类型事件小结
- jQuery bind事件使用详解
- jQuery支持添加事件的日历特效代码分享(3种样式)
- C#中委托和事件的区别实例解析
- SQLSERVER中得到执行计划的两种方式
- C#中事件的动态调用实现方法
- ASP.NET中实现定制自己的委托和事件参数类
- C#处理Paint事件的方法
- javascript下利用for( in )语句 获得所有事件名称的代码
- 关于JavaScript与HTML的交互事件
- jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
- JavaScript 学习笔记(十六) js事件
- 通过event对象的fromElement属性解决热区设置主实体的一个bug