Solution46
CSemaphore.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// セマフォクラス実装ファイル
4 ///
5 /// セマフォクラス実装ファイルです。
6 ///
7 /// $Id: CSemaphore.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 <CSemaphore.h>
18 
19 //=============================================================================
20 // 共通ライブラリ名前空間
21 namespace LibCommon {
22  //=========================================================================
23  // セマフォクラス
24  //=========================================================================
25  // 構築子と解体子
26  //-------------------------------------------------------------------------
27  // コンストラクタ
29  // 基底クラスコンストラクタ
30  : CSync()
31  {}
32 
33  //=========================================================================
34  // 公開関数
35  //-------------------------------------------------------------------------
36  // リリース関数
37  bool CSemaphore::Release() noexcept {
38  // 処理ブロック
39  bool result = false;
40  do {
41  // セマフォカウントを加算する
42  long prev;
43  result = AddCount( 1, prev );
44  } while ( false );
45 
46  // 実行結果を返す
47  return result;
48  }
49 
50  //-------------------------------------------------------------------------
51  // 作成関数
52  bool CSemaphore::Create( wchar_t const* pszObjectName ) noexcept {
53  // 引数を指定して作成する
54  return Create( 1, 1, pszObjectName );
55  }
56 
57  //-------------------------------------------------------------------------
58  // 作成関数
59  bool CSemaphore::Create( LONG nInitial, LONG nMax, wchar_t const* pszObjectName ) noexcept {
60  // 処理ブロック
61  bool result = false;
62  do {
63  // セマフォハンドルを調べる
64  if ( nullptr != m_hObject ) {
65  // クローズする
66  Close();
67  }
68 
69  // オブジェクト名を調べる
70  wchar_t szBuffer[ MAX_PATH ];
71  if ( nullptr != pszObjectName ) {
72  // オブジェクト名に拡張子を追加する
73  ::wcscpy_s( szBuffer, pszObjectName );
74  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
75  pszObjectName = szBuffer;
76  }
77 
78  // セマフォを作成する
79  m_hObject = ::CreateSemaphoreW( nullptr, nInitial, nMax, pszObjectName );
80  if ( nullptr == m_hObject ) {
81  // 失敗!
82  break;
83  }
84  // エラーコードを調べる
85  else if ( ERROR_ALREADY_EXISTS != ::GetLastError() ) {
86  // 新規作成フラグをセットする
87  m_bIsCreate = true;
88  }
89 
90  // 成功!
91  result = true;
92  } while ( false );
93 
94  // 実行結果を返す
95  return result;
96  }
97 
98  //-------------------------------------------------------------------------
99  // オープン関数
100  bool CSemaphore::Open( wchar_t const* pszObjectName ) noexcept {
101  // 処理ブロック
102  bool result = false;
103  do {
104  // オブジェクト名を調べる
105  if ( nullptr == pszObjectName ) {
106  // 失敗!
107  break;
108  }
109  // セマフォハンドルを調べる
110  else if ( nullptr != m_hObject ) {
111  // クローズする
112  Close();
113  }
114 
115  // オブジェクト名に拡張子を追加する
116  wchar_t szBuffer[ MAX_PATH ];
117  ::wcscpy_s( szBuffer, pszObjectName );
118  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
119  pszObjectName = szBuffer;
120 
121  // セマフォをオープンする
122  m_hObject = ::OpenSemaphoreW( SEMAPHORE_ALL_ACCESS, false, pszObjectName );
123  if ( nullptr == m_hObject ) {
124  // 失敗!
125  break;
126  }
127 
128  // 成功!
129  result = true;
130  } while ( false );
131 
132  // 実行結果を返す
133  return result;
134  }
135 
136  //-------------------------------------------------------------------------
137  // カウント加算関数
138  bool CSemaphore::AddCount( long nCount, long& rnPrev ) noexcept {
139  // 処理ブロック
140  bool result = false;
141  do {
142  // セマフォカウントを加算する
143  if ( 0 == ::ReleaseSemaphore( m_hObject, nCount, &rnPrev ) ) {
144  // 失敗!
145  break;
146  }
147 
148  // 成功!
149  result = true;
150  } while ( false );
151 
152  // 実行結果を返す
153  return result;
154  }
155 
156  //=====================================================================
157  // 静的限定公開文字列定数
158  wchar_t const* const CSemaphore::OBJECT_NAME_EXT = L".CSemaphore";
159 }
160 
161 #pragma managed( pop )
virtual void Close() noexcept
クローズ関数
Definition: CSync.cpp:45
virtual bool AddCount(long nCount, long &rnPrev) noexcept
カウント加算関数
Definition: CSemaphore.cpp:138
virtual bool Open(wchar_t const *pszObjectName) noexcept
オープン関数
Definition: CSemaphore.cpp:100
virtual bool Create(wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CSemaphore.cpp:52
同期クラス
Definition: CSync.h:30
セマフォクラスヘッダファイル
bool m_bIsCreate
新規作成フラグ
Definition: CSync.h:153
static wchar_t const *const OBJECT_NAME_EXT
オブジェクト名拡張子
Definition: CSemaphore.h:130
共通ライブラリ名前空間
Definition: CArray.h:23
CSemaphore() noexcept
コンストラクタ
Definition: CSemaphore.cpp:28
HANDLE m_hObject
オブジェクトハンドル
Definition: CSync.h:152
virtual bool Release() noexcept override
リリース関数
Definition: CSemaphore.cpp:37