多线程Event之详解
2013-03-16 13:47
323 查看
Ø 要产生一个event对象,需要调用CreateEvent
HANDLE CreateEvent
(
LPSECURITY_ATTRIBUTESlpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName
);
参数:
lpEventAttributes 安全属性,NULL表示使用默认属性,该属性在Window 95中会被忽
略。
bManualReset 如为FALSE,表示这个event将在变成激发状态(因而唤醒一个线程)之后,自动重置(reset)为非激发状态。若为TRUE则表示不会自动重置,必须
靠程序操作(调用ResetEvent())才能将激发状态的event
重置为非激发状态。
bInitialState 如为TRUE,表示这个event一开始处于激发状态。如为FALSE,则表示这个event一开始处于非激发状态。
lpName
Event对象的名称。任何线程或进程都可以根据这个文字名称,使用这一event对象。
返回值:
如果调用成功,会传回一个event handle,GetLastError()会传回0。如果lpName所指定的event对象已经存在,CreateEvent()传回的是该event handle,而不会产生一个新的。这时候GetLastError会传回ERROR_ALREADY_EXISTS。如果CreateEvent()失败,传回的是NULL,GetLastError()可以获得更进一步的失败信息。
Ø 函数说明
SetEvent() 把event对象设为激发状态
ResetEvent() 把event对象设为非激发状态
PulseEvent() 如果是一个Manual Reset Event:把event对象设为激发状态,唤醒“所
有”等待中的线程,然后event恢复为非激发状态。如果是一个Auto Reset
Event:把evnet对象设为激发状态,唤醒“一个”等待中的线程,然后event
恢复为非激发状态。
Ø 名词说明
激发态: 可以再次被锁定或可以被WaitXXXXObjectXX类函数等待成功(可以这样认为,现在对象的状态是:其他线程可以处理这个对象了)
非激发态:
这个对象已经被其中一个线程所拥有,则此时这个对象所呈现的状态是其他线程不能再得到这个对象。当用WaitXXX函数操作时,不会成功。
Ø 使用方法1
HANDLE hEvent = ::CreateEvent(
NULL, //默认安全属性
TRUE, //手动重置
FALSE, //初始处于非激发态
NULL //名子
);
SetEvent(hEvent); //设置为激发态
DWORD WINAPI ThreadFun1(LPVOID p)
{
WaitForSingleObject(hEvent,INFINITE);
ResetEvent(hEvent); //设置为非激发态
/*
操作……
*/
SetEvent(hEvent); //设置为激发态
return (DWORD) 0;
}
Ø 使用方法2
HANDLE hEvent = ::CreateEvent(
NULL, //默认安全属性
FALSE, //自动重置
FALSE, //一开始处于非激发态
NULL //名子
);
SetEvent(hEvent); //设置为激发态
DWORD WINAPI ThreadFun1(LPVOID p)
{
WaitForSingleObject(hEvent,INFINITE);
/*
操作……
*/
SetEvent(hEvent); //设置为激发态
return (DWORD) 0;
}
HANDLE CreateEvent
(
LPSECURITY_ATTRIBUTESlpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName
);
参数:
lpEventAttributes 安全属性,NULL表示使用默认属性,该属性在Window 95中会被忽
略。
bManualReset 如为FALSE,表示这个event将在变成激发状态(因而唤醒一个线程)之后,自动重置(reset)为非激发状态。若为TRUE则表示不会自动重置,必须
靠程序操作(调用ResetEvent())才能将激发状态的event
重置为非激发状态。
bInitialState 如为TRUE,表示这个event一开始处于激发状态。如为FALSE,则表示这个event一开始处于非激发状态。
lpName
Event对象的名称。任何线程或进程都可以根据这个文字名称,使用这一event对象。
返回值:
如果调用成功,会传回一个event handle,GetLastError()会传回0。如果lpName所指定的event对象已经存在,CreateEvent()传回的是该event handle,而不会产生一个新的。这时候GetLastError会传回ERROR_ALREADY_EXISTS。如果CreateEvent()失败,传回的是NULL,GetLastError()可以获得更进一步的失败信息。
Ø 函数说明
SetEvent() 把event对象设为激发状态
ResetEvent() 把event对象设为非激发状态
PulseEvent() 如果是一个Manual Reset Event:把event对象设为激发状态,唤醒“所
有”等待中的线程,然后event恢复为非激发状态。如果是一个Auto Reset
Event:把evnet对象设为激发状态,唤醒“一个”等待中的线程,然后event
恢复为非激发状态。
Ø 名词说明
激发态: 可以再次被锁定或可以被WaitXXXXObjectXX类函数等待成功(可以这样认为,现在对象的状态是:其他线程可以处理这个对象了)
非激发态:
这个对象已经被其中一个线程所拥有,则此时这个对象所呈现的状态是其他线程不能再得到这个对象。当用WaitXXX函数操作时,不会成功。
Ø 使用方法1
HANDLE hEvent = ::CreateEvent(
NULL, //默认安全属性
TRUE, //手动重置
FALSE, //初始处于非激发态
NULL //名子
);
SetEvent(hEvent); //设置为激发态
DWORD WINAPI ThreadFun1(LPVOID p)
{
WaitForSingleObject(hEvent,INFINITE);
ResetEvent(hEvent); //设置为非激发态
/*
操作……
*/
SetEvent(hEvent); //设置为激发态
return (DWORD) 0;
}
Ø 使用方法2
HANDLE hEvent = ::CreateEvent(
NULL, //默认安全属性
FALSE, //自动重置
FALSE, //一开始处于非激发态
NULL //名子
);
SetEvent(hEvent); //设置为激发态
DWORD WINAPI ThreadFun1(LPVOID p)
{
WaitForSingleObject(hEvent,INFINITE);
/*
操作……
*/
SetEvent(hEvent); //设置为激发态
return (DWORD) 0;
}
相关文章推荐
- 详解python多线程、锁、event事件机制的简单使用
- python多线程之事件Event的使用详解
- java多线程详解(3)-线程的互斥与同步
- c#使用多线程的几种方式示例详解
- java多线程详解
- java多线程详解(5)-Threadlocal用法
- Android 多线程-----AsyncTask详解
- 4.0中的并行计算和多线程详解(一)
- iOS 多线程详解
- IOS 开发进阶--多线程和网络--NSThread 的详解
- Mysql定时任务EVENT详解
- 4.0中的并行计算和多线程详解(一)
- javascript event详解
- java 多线程详解二 买票示例
- JS中的event 对象详解
- 代码详解の多线程下的代码死锁
- java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
- Java 多线程(六) synchronized关键字详解(牛叉)
- C# 多线程 详解
- Java Socket多线程编程、通信模型及socket协议详解