Solution46
CEvent.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// イベントクラス実装ファイル
4 ///
5 /// イベントクラス実装ファイルです。
6 ///
7 /// $Id: CEvent.cpp 245 2019-03-20 15:03:41Z admin $
8 /// $Date: 2019-03-21 00:03:41 +0900 (2019/03/21 (木)) $
9 /// $Author: admin $
10 ///
11 /// @attention なし
12 
13 #pragma managed( push, off )
14 
15 //=============================================================================
16 // インクルードファイル
17 #include <CEvent.h>
18 
19 //=============================================================================
20 // 共通ライブラリ名前空間
21 namespace LibCommon {
22  //=========================================================================
23  // イベントクラス
24  //=========================================================================
25  // 構築子と解体子
26  //-------------------------------------------------------------------------
27  // コンストラクタ
28  CEvent::CEvent() noexcept
29  // 基底クラスコンストラクタ
30  : CSync()
31  {}
32 
33  //=========================================================================
34  // 公開関数
35  //-------------------------------------------------------------------------
36  // リリース関数
37  bool CEvent::Release() noexcept {
38  // シグナルをリセットする
39  return Reset();
40  }
41 
42  //-------------------------------------------------------------------------
43  // 作成関数
44  bool CEvent::Create( wchar_t const* pszObjectName ) noexcept {
45  // 引数を指定してイベントを作成する
46  return Create( false, false, pszObjectName );
47  }
48 
49  //-------------------------------------------------------------------------
50  // 作成関数
51  bool CEvent::Create( bool bManual, bool bState, wchar_t const* pszObjectName ) noexcept {
52  // 処理ブロック
53  bool result = false;
54  do {
55  // イベントハンドルを調べる
56  if ( nullptr != m_hObject ) {
57  // クローズする
58  Close();
59  }
60 
61  // オブジェクト名を調べる
62  wchar_t szBuffer[ MAX_PATH ];
63  if ( nullptr != pszObjectName ) {
64  // オブジェクト名に拡張子を追加する
65  ::wcscpy_s( szBuffer, pszObjectName );
66  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
67  pszObjectName = szBuffer;
68  }
69 
70  // イベントを作成する
71  m_hObject = ::CreateEventW( nullptr, bManual, bState, pszObjectName );
72  if ( nullptr == m_hObject ) {
73  // 失敗!
74  break;
75  }
76  // エラーコードを調べる
77  else if ( ERROR_ALREADY_EXISTS != ::GetLastError() ) {
78  // 新規作成フラグをセットする
79  m_bIsCreate = true;
80  }
81 
82  // 成功!
83  result = true;
84  } while ( false );
85 
86  // 実行結果を返す
87  return result;
88  }
89 
90  //-------------------------------------------------------------------------
91  // オープン関数
92  bool CEvent::Open( wchar_t const* pszObjectName ) noexcept {
93  // 処理ブロック
94  bool result = false;
95  do {
96  // オブジェクト名を調べる
97  if ( nullptr == pszObjectName ) {
98  // 失敗!
99  break;
100  }
101  // イベントハンドルを調べる
102  else if ( nullptr != m_hObject ) {
103  // クローズする
104  Close();
105  }
106 
107  // オブジェクト名に拡張子を追加する
108  wchar_t szBuffer[ MAX_PATH ];
109  ::wcscpy_s( szBuffer, pszObjectName );
110  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
111  pszObjectName = szBuffer;
112 
113  // イベントをオープンする
114  m_hObject = ::OpenEventW( EVENT_ALL_ACCESS, false, pszObjectName );
115  if ( nullptr == m_hObject ) {
116  // 失敗!
117  break;
118  }
119 
120  // 成功!
121  result = true;
122  } while ( false );
123 
124  // 実行結果を返す
125  return result;
126  }
127 
128  //-------------------------------------------------------------------------
129  // シグナルセット関数
130  bool CEvent::Set() noexcept {
131  // 処理ブロック
132  bool result = false;
133  do {
134  // イベントをシグナル状態にする
135  if ( 0 == ::SetEvent( m_hObject ) ) {
136  // 失敗!
137  break;
138  }
139 
140  // 成功!
141  result = true;
142  } while ( false );
143 
144  // 実行結果を返す
145  return result;
146  }
147 
148  //-------------------------------------------------------------------------
149  // シグナルリセット関数
150  bool CEvent::Reset() noexcept {
151  // 処理ブロック
152  bool result = false;
153  do {
154  // イベントを非シグナル状態にする
155  if ( 0 == ::ResetEvent( m_hObject ) ) {
156  // 失敗!
157  break;
158  }
159 
160  // 成功!
161  result = true;
162  } while ( false );
163 
164  // 実行結果を返す
165  return result;
166  }
167 
168  //-------------------------------------------------------------------------
169  // シグナルパルス関数
170  bool CEvent::Pulse() noexcept {
171  // 処理ブロック
172  bool result = false;
173  do {
174  // イベントをパルスする
175  if ( 0 == ::PulseEvent( m_hObject ) ) {
176  // 失敗!
177  break;
178  }
179 
180  // 成功!
181  result = true;
182  } while ( false );
183 
184  // 実行結果を返す
185  return result;
186  }
187 
188  //=====================================================================
189  // 静的限定公開文字列定数
190  wchar_t const* const CEvent::OBJECT_NAME_EXT = L".CEvent";
191 }
192 
193 #pragma managed( pop )
virtual bool Open(wchar_t const *pszObjectName) noexcept
オープン関数
Definition: CEvent.cpp:92
virtual void Close() noexcept
クローズ関数
Definition: CSync.cpp:45
static wchar_t const *const OBJECT_NAME_EXT
オブジェクト名拡張子
Definition: CEvent.h:155
同期クラス
Definition: CSync.h:30
virtual bool Pulse() noexcept
シグナルパルス関数
Definition: CEvent.cpp:170
bool m_bIsCreate
新規作成フラグ
Definition: CSync.h:153
共通ライブラリ名前空間
Definition: CArray.h:23
virtual bool Create(wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CEvent.cpp:44
virtual bool Release() noexcept override
リリース関数
Definition: CEvent.cpp:37
HANDLE m_hObject
オブジェクトハンドル
Definition: CSync.h:152
virtual bool Set() noexcept
シグナルセット関数
Definition: CEvent.cpp:130
virtual bool Reset() noexcept
シグナルリセット関数
Definition: CEvent.cpp:150
イベントクラスヘッダファイル
CEvent() noexcept
コンストラクタ
Definition: CEvent.cpp:28