一个轻量级的事件对象

来源:互联网 发布:用单片机实现电子音响 编辑:程序博客网 时间:2024/05/16 00:40

评论请移步http://zbm.xuanwo.tk/2011/03/slim-event.html

“事件”对象的一个轻量级实现,方法与“信号量”基本一样。

 1 class CSlimEvent
 2 {
 3 private:
 4     SRWLOCK m_lock;
 5     CONDITION_VARIABLE m_cv;
 6     BOOL m_manual;
 7     BOOL m_state;
 8 
 9 public:
10     CSlimEvent( BOOL bManualReset, BOOL bInitialState )
11     {
12         InitializeSRWLock( &m_lock );
13         InitializeConditionVariable( &m_cv );
14         m_manual = bManualReset;
15         m_state = bInitialState;
16     }
17 
18     ~CSlimEvent() { }
19 
20     BOOL Set()
21     {
22         AcquireSRWLockExclusive( &m_lock );
23         m_state = TRUE;
24         ReleaseSRWLockExclusive( &m_lock );
25 
26         if( m_manual )
27             WakeAllConditionVariable( &m_cv );
28         else
29             WakeConditionVariable( &m_cv );
30 
31         return TRUE;
32     }
33 
34     BOOL Reset()
35     {
36         AcquireSRWLockExclusive( &m_lock );
37         m_state = FALSE;
38         ReleaseSRWLockExclusive( &m_lock );
39         return TRUE;
40     }
41 
42     DWORD Wait( DWORD dwTimeout )
43     {
44         DWORD result = WAIT_TIMEOUT;
45         DWORD start = GetTickCount();
46 
47         AcquireSRWLockExclusive( &m_lock );
48 
49         whiletrue )
50         {
51             if( m_state )
52             {
53                 m_state = m_manual;
54                 result = WAIT_OBJECT_0;
55                 break;
56             }
57 
58             if( dwTimeout != INFINITE )
59             {
60                 DWORD end = GetTickCount();
61                 if( end - start >= dwTimeout )
62                     break;
63                 dwTimeout -= end - start;
64                 start = end;
65             }
66 
67             if!SleepConditionVariableSRW( &m_cv, &m_lock, dwTimeout, 0 ) )
68             {
69                 if( GetLastError() != ERROR_TIMEOUT )
70                     result = WAIT_FAILED;
71                 break;
72             }
73         }
74 
75         ReleaseSRWLockExclusive( &m_lock );
76 
77         return result;
78     }
79 };
原创粉丝点击