您的位置:首页 > 其它

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 关闭事件

      CloseHandle

    2.5 重置事件

//事件置为0无信号

      BOOL ResetEvent(

       HANDLE hEvent //事件句柄

      );

    2.6 其他函数

      OpenEvent
      PulseEvent

// 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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息