标签:
事件对象就像一个开关:它仅仅有两种状态---开和关。当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”。能够在一个线程的运行函数中创建一个事件对象,然后观察它的状态,假设是”无信号”就让该线程睡眠,这样该线程占用的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函数来清除事件
的信号。
??? 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)。??
发表于 @ 2008年04月18日 13:30:00|评论(0)|编辑

 #include?<?iostream>
#include?<?iostream> #include?<?windows.h>
#include?<?windows.h>
 using?namespace?std;
using?namespace?std; #define?BUFSIZE?5
#define?BUFSIZE?5 int?SharedBuffer[BUFSIZE];
int?SharedBuffer[BUFSIZE]; int?head,tail;
int?head,tail; int?count;
int?count; HANDLE?hMutex;
HANDLE?hMutex; HANDLE?hNotFullEvent,?hNotEmptyEvent;
HANDLE?hNotFullEvent,?hNotEmptyEvent; void?BB_Producer()
void?BB_Producer() {
{ int?i;
int?i; for?(i=20;?i>=0;?i--)?{
for?(i=20;?i>=0;?i--)?{ while(1)?{
while(1)?{ WaitForSingleObject(hMutex,INFINITE);
WaitForSingleObject(hMutex,INFINITE); if?(count?==?BUFSIZE)?{?//?缓冲区满
if?(count?==?BUFSIZE)?{?//?缓冲区满 ReleaseMutex(hMutex);
ReleaseMutex(hMutex); //?等待直到缓冲区非满
//?等待直到缓冲区非满 WaitForSingleObject(hNotFullEvent,INFINITE);
WaitForSingleObject(hNotFullEvent,INFINITE); continue;
continue; }
} //?得到相互排斥锁且缓冲区非满,跳出while循环
//?得到相互排斥锁且缓冲区非满,跳出while循环 break;
break; }
} //?得到相互排斥锁且缓冲区非满,開始产生新数据
//?得到相互排斥锁且缓冲区非满,開始产生新数据 cout?<<?"Produce:?"?<<?i?<<?endl;
cout?<<?"Produce:?"?<<?i?<<?endl; SharedBuffer[tail]?=?i;
SharedBuffer[tail]?=?i; tail?=?(tail+1)?%?BUFSIZE;
tail?=?(tail+1)?%?BUFSIZE; count++;
count++; ReleaseMutex(hMutex);?//?结束临界区
ReleaseMutex(hMutex);?//?结束临界区 PulseEvent(hNotEmptyEvent);?//?唤醒消费者线程
PulseEvent(hNotEmptyEvent);?//?唤醒消费者线程 }
} }
} void?BB_Consumer()
void?BB_Consumer() {
{ int?result;
int?result; while?(1)?{
while?(1)?{ WaitForSingleObject(hMutex,INFINITE);
WaitForSingleObject(hMutex,INFINITE); if?(count?==?0)?{?//?没有能够处理的数据
if?(count?==?0)?{?//?没有能够处理的数据 ReleaseMutex(hMutex);?//?释放相互排斥锁且等待
ReleaseMutex(hMutex);?//?释放相互排斥锁且等待 //?等待直到缓冲区非空
//?等待直到缓冲区非空 WaitForSingleObject(hNotEmptyEvent,INFINITE);
WaitForSingleObject(hNotEmptyEvent,INFINITE); }
} else?if?(SharedBuffer[head]?==?0)?{
else?if?(SharedBuffer[head]?==?0)?{ cout?<<?"Consumed?0:?end?of?data"?<<?endl;
cout?<<?"Consumed?0:?end?of?data"?<<?endl; ReleaseMutex(hMutex);?//?结束临界区
ReleaseMutex(hMutex);?//?结束临界区 ExitThread(0);
ExitThread(0); }
} else?{?//?获得相互排斥锁且缓冲区有数据,開始处理
else?{?//?获得相互排斥锁且缓冲区有数据,開始处理 result?=?SharedBuffer[head];
result?=?SharedBuffer[head]; cout?<<?"Consumed:?"?<<?result?<<?endl;
cout?<<?"Consumed:?"?<<?result?<<?endl; head?=?(head+1)?%?BUFSIZE;
head?=?(head+1)?%?BUFSIZE; count--;
count--; ReleaseMutex(hMutex);?//?结束临界区
ReleaseMutex(hMutex);?//?结束临界区 PulseEvent(hNotFullEvent);?//?唤醒生产者线程
PulseEvent(hNotFullEvent);?//?唤醒生产者线程 }
} }
} }
} void?main()
void?main() {
{ HANDLE?hThreadVector[2];
HANDLE?hThreadVector[2]; DWORD?ThreadID;
DWORD?ThreadID; count?=?0;
count?=?0; head?=?0;
head?=?0; tail?=?0;
tail?=?0; hMutex?=?CreateMutex(NULL,FALSE,NULL);
hMutex?=?CreateMutex(NULL,FALSE,NULL); hNotFullEvent?=?CreateEvent(NULL,TRUE,FALSE,NULL);
hNotFullEvent?=?CreateEvent(NULL,TRUE,FALSE,NULL); hNotEmptyEvent?=?CreateEvent(NULL,TRUE,FALSE,NULL);
hNotEmptyEvent?=?CreateEvent(NULL,TRUE,FALSE,NULL); hThreadVector[0]?=?CreateThread?(NULL,?0,
hThreadVector[0]?=?CreateThread?(NULL,?0, (LPTHREAD_START_ROUTINE)?BB_Producer,
(LPTHREAD_START_ROUTINE)?BB_Producer, NULL,?0,?(LPDWORD)&ThreadID);
NULL,?0,?(LPDWORD)&ThreadID); hThreadVector[1]?=?CreateThread?(NULL,?0,
hThreadVector[1]?=?CreateThread?(NULL,?0, (LPTHREAD_START_ROUTINE)?BB_Consumer,
(LPTHREAD_START_ROUTINE)?BB_Consumer, NULL,?0,?(LPDWORD)&ThreadID);
NULL,?0,?(LPDWORD)&ThreadID); WaitForMultipleObjects(2,hThreadVector,TRUE,INFINITE);
WaitForMultipleObjects(2,hThreadVector,TRUE,INFINITE); }
}发表于 @ 2006年10月29日 19:54:00|评论(2)|编辑
发表于 @ 2007年09月25日 21:32:00|评论(0)|编辑
 HANDLE?CreateEvent(
HANDLE?CreateEvent( ??LPSECURITY_ATTRIBUTES?lpEventAttributes,?
??LPSECURITY_ATTRIBUTES?lpEventAttributes,? ??BOOL?bManualReset,?
??BOOL?bManualReset,? ??BOOL?bInitialState,?
??BOOL?bInitialState,? ??LPTSTR?lpName?
??LPTSTR?lpName? );?
);? DWORD?WaitForSingleObject(
DWORD?WaitForSingleObject( ??HANDLE?hHandle,
??HANDLE?hHandle, ??DWORD?dwMilliseconds
??DWORD?dwMilliseconds );
); DWORD?WaitForMultipleObjects(
DWORD?WaitForMultipleObjects( ??DWORD?nCount,
??DWORD?nCount, ??const?HANDLE*?lpHandles,
??const?HANDLE*?lpHandles, ??BOOL?bWaitAll,
??BOOL?bWaitAll, ??DWORD?dwMilliseconds
??DWORD?dwMilliseconds );
);发表于 @ 2007年10月28日 18:04:00|评论(0)|编辑
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4509964.html