CreateEvent的⽤法
事件对象就像⼀个开关:它只有两种状态---开和关。当⼀个事件处于”开”状态,我们称其为”有信号”否则称为”⽆信号”。可以在⼀个线程的执⾏函数中创建⼀个事件对象,然后观察它的状态,如果是”⽆信号”就让该线程睡眠,这样该线程占⽤的CPU时间就⽐较少。
产⽣事件对象的函数如下:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, // reset type
BOOL bInitialState, // initial state
LPCTSTR lpName // object name
);
该函数创建⼀个Event同步对象,如果CreateEvent调⽤成功的话,会返回新⽣成的对象的句柄,否则返回
NULL。
参数说明:
lpEventAttributes ⼀般为NULL
bManualReset 创建的Event是⾃动复位还是⼈⼯复位.如果true,⼈⼯复位, ⼀旦该Event被设置为有信号,则它⼀直会等到ResetEvent()API被调⽤时才会恢复为⽆信号. 如果为false,Event被设置为有信号,则当有⼀个wait到它的Thread时, 该Event就会⾃动复位,变成⽆信号. 如果想在每次调⽤WaitForSingleObject 后让WINDOWS为您⾃动地把事件地状态恢复为”⽆信号”状态,必须把该参数设为FALSE,否则,您必须每次调⽤ResetEvent函数来清除事件的信号。
waitforsingleobject函数bInitialState 初始状态,true,有信号,false⽆信号
lpName 事件对象的名称。您在OpenEvent函数中可能使⽤。
注释:
⼀个Event被创建以后,可以⽤OpenEvent()API来获得它的Handle,⽤CloseHandle() 来关闭它,⽤SetEvent()或PulseEvent()来设置它使其有信号,⽤ResetEvent() 来使其⽆信号,⽤WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号.
PulseEvent()是⼀个⽐较有意思的使⽤⽅法,正如这个API的名字,它使⼀个Event 对象的状态发⽣⼀次脉冲变化,从⽆信号变成有信号再变成⽆信号,⽽整个操作是原⼦的.
对⾃动复位的Event对象,它仅释放第⼀个等到该事件的thread(如果有),⽽对于⼈⼯复位的Event对象,它释放所有等待的thread.
这⾥有两个API函数⽤来修改事件对象的信号状态:SetEvent和ResetEvent。前者把事件对象设为”有信号”状态,⽽后者正好相反。
在事件对象⽣成后,必须调⽤WaitForSingleObject来让线程进⼊等待状态,该函数的语法如下:
WaitForSingleObject proto hObject:DWORD, dwTimeout:DWORD
hObject -->指向同步对象的指针。事件对象其实是同步对象的⼀种。
dwTimeout --> 等待同步对象变成”有信号”前等待的时间,以毫秒计。当等待的时间超过该值后⽆信号同步对象仍处于”⽆信号”状态,线程不再等待, WaitForSingleObject函数会返回。如果想要线程⼀直等待,请把该参数设为INFINITE(该值等于0xffffffff)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论