首页 > 代码库 > win32 多线程 (五)Event
win32 多线程 (五)Event
Event是内核对象,他可以分为自动和手动两种模式。
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); 参数lpEventAttributes 安全属性。NULL 表示使用默认属性。该属性在Windows 95中会被忽略。bManualReset 如为FALSE,表示这个event 将在变成激发状态(因而唤醒一个线程)之后,自动重置(reset)为非激发状态。如果是TRUE,表示不会自动重置,必须靠程序操作(调用ResetEvent())才能将激发状态的event 重置为非激发状态。bInitialState 如为TRUE,表示这个event 一开始处于激发状态。如为FALSE,则表示这个event 一开始处于非激发状态。lpNameEvent 对象的名称。任何线程或进程都可以根据这个文字名称,使用这一event 对象。
SetEvent() 把event 对象设为激发状态ResetEvent() 把event 对象设为非激发状态(译注:在此我要提醒读者,"Reset" 的意思是“设定为非激发状态”,而非“重新设定为激发状态”。)PulseEvent() 如果是一个 Manual Reset Event :把event 对象设为激发状态,唤醒“所有”等待中的线程,然后event 恢复为非激发状态。如果是一个Auto Reset Event:把event 对象设为激发状态,唤醒“一个”等待中的线程,然后event 恢复为非激发状态
下面做一个模拟实验,用两个线程轮流输出10次,当然哪个先开始也是可以控制的。
#pragma once#include <Windows.h>#include <iostream>using namespace std;class EventOption{public: EventOption(void); ~EventOption(void); void StartRnner(); void ReleaseOption();private: static DWORD WINAPI ThreadFunctionA(LPVOID param); static DWORD WINAPI ThreadFunctionB(LPVOID param); void FunctionA(); void FunctionB();private: HANDLE m_hThreadA; HANDLE m_hThreadB; HANDLE m_hEventA; HANDLE m_hEventB;}; #include "EventOption.h"EventOption::EventOption(void){}EventOption::~EventOption(void){}// interfacevoid EventOption::StartRnner(){ m_hEventA = CreateEvent(NULL, TRUE, FALSE, NULL); m_hEventB = CreateEvent(NULL, TRUE, FALSE, NULL); SetEvent(m_hEventA); m_hThreadA = CreateThread(NULL, 0, ThreadFunctionA, this, 0, NULL); m_hThreadB = CreateThread(NULL, 0, ThreadFunctionB, this, 0, NULL);}void EventOption::ReleaseOption(){ WaitForSingleObject(m_hThreadA, INFINITE); WaitForSingleObject(m_hThreadB, INFINITE); CloseHandle(m_hEventA); CloseHandle(m_hEventB); CloseHandle(m_hThreadA); CloseHandle(m_hThreadB);}//privateDWORD EventOption::ThreadFunctionA(LPVOID param){ EventOption *pThis = (EventOption*)param; pThis->FunctionA(); return 0;}DWORD EventOption::ThreadFunctionB(LPVOID param){ EventOption *pThis = (EventOption*)param; pThis->FunctionB(); return 0;}void EventOption::FunctionA(){ int iCount = 10; while(iCount--) { WaitForSingleObject(m_hEventA, INFINITE); cout<<"FunctionA: "<<iCount<<endl; ResetEvent(m_hEventA); SetEvent(m_hEventB); }}void EventOption::FunctionB(){ int iCount = 10; while(iCount--) { WaitForSingleObject(m_hEventB, INFINITE); cout<<"FunctionB: "<<iCount<<endl; ResetEvent(m_hEventB); SetEvent(m_hEventA); }}#include "EventOption.h"int _tmain(int argc, _TCHAR* argv[]){ EventOption test; test.StartRnner(); test.ReleaseOption(); ::getchar(); return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。