一个轻量级的事件对象
来源:互联网 发布:用单片机实现电子音响 编辑:程序博客网 时间: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 while( true )
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 };
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 while( true )
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 };
- 一个轻量级的事件对象
- 一个轻量级的单写多读锁
- 一个轻量级的信号量
- 设计一个超轻量级的类EventBus事件传递工具类
- 一个轻量级的分页框架
- peewee 一个轻量级的ORM
- 一个轻量级的网络架构
- nanobar一个轻量级的进度条
- 多层 UI 触摸事件的轻量级设计
- 多层 UI 触摸事件的轻量级设计
- 多层 UI 触摸事件的轻量级设计
- 多层 UI 触摸事件的轻量级设计
- eventbus轻量级的事件发送框架
- 用ATL建立轻量级的COM对象
- 用ATL建立轻量级的COM对象
- IBatis-轻量级的对象关系映射框架
- 用ATL建立轻量级的COM对象
- 用ATL建立轻量级的COM对象
- JavaScript中arguments
- 后台判断是否是数字
- 如何分析log 来解决问题--推荐--网上绝无仅有的Log分析教程及例子!
- 解决unresolved external symbol 在你的代码里面加上这一句: #define _AFX_ENABLE_INLINES
- HTML5设计原理(3)
- 一个轻量级的事件对象
- C#读取被进程占用的文件(转)
- C++ 多重继承
- 内存泄露知识
- 内存泄露知识
- 学习SEO 先端正态度
- boj 1329 简单算法 利用栈来计数
- Oracle 9i 数据库管理员指南
- 无法启动 Asp.net Development Server