Solution46
CThread.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// スレッドクラス実装ファイル
4 ///
5 /// スレッドクラス実装ファイルです。
6 ///
7 /// $Id: CThread.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 <CThread.h>
18 
19 //=============================================================================
20 // 共通ライブラリ名前空間
21 namespace LibCommon {
22  //=========================================================================
23  // スレッドクラス
24  //=========================================================================
25  // 構築子と解体子
26  //-------------------------------------------------------------------------
27  // コンストラクタ
28  CThread::CThread() noexcept
29  // 基底クラスコンストラクタ
30  : CSync()
31  // メンバ変数初期化
32  , m_dwThreadId( 0 )
33  {}
34 
35  //-------------------------------------------------------------------------
36  // デストラクタ
37  CThread::~CThread() noexcept {
38  // クローズする
39  Close();
40  }
41 
42  //=========================================================================
43  // 公開関数
44  //-------------------------------------------------------------------------
45  // クローズ関数
46  void CThread::Close() noexcept {
47  // 基底クラスの関数を実行する
48  CSync::Close();
49 
50  // メンバ変数を初期化する
51  m_dwThreadId = 0;
52  }
53 
54  //-------------------------------------------------------------------------
55  // リリース関数
56  bool CThread::Release() noexcept {
57  // 強制終了する
58  return Terminate();
59  }
60 
61  //-------------------------------------------------------------------------
62  // 作成関数
63  bool CThread::Create( LPTHREAD_START_ROUTINE pfnFunc, LPVOID lpParam ) noexcept {
64  // 処理ブロック
65  bool result = false;
66  do {
67  // 関数アドレスを調べる
68  if ( nullptr == pfnFunc ) {
69  // 失敗!
70  break;
71  }
72  // スレッドハンドルを調べる
73  else if ( nullptr != m_hObject ) {
74  // クローズする
75  Close();
76  }
77 
78  // スレッドを作成する
79  m_hObject = ::CreateThread( nullptr, 0, pfnFunc, lpParam, 0, nullptr );
80  if ( nullptr == m_hObject ) {
81  // 失敗!
82  break;
83  }
84 
85  // スレッドIDを取得する
87 
88  // 成功!
89  result = true;
90  } while ( false );
91 
92  // 実行結果を返す
93  return result;
94  }
95 
96  //-------------------------------------------------------------------------
97  // オープン関数
98  bool CThread::Open( DWORD dwThreadId, DWORD dwAccess ) noexcept {
99  // 処理ブロック
100  bool result = false;
101  do {
102  // スレッドハンドルを調べる
103  if ( nullptr != m_hObject ) {
104  // クローズする
105  Close();
106  }
107 
108  // スレッドをオープンする
109  m_hObject = ::OpenThread( dwAccess, false, dwThreadId );
110  if ( nullptr == m_hObject ) {
111  // 失敗!
112  break;
113  }
114 
115  // スレッドIDを設定する
116  m_dwThreadId = dwThreadId;
117 
118  // 成功!
119  result = true;
120  } while ( false );
121 
122  // 実行結果を返す
123  return result;
124  }
125 
126  //-------------------------------------------------------------------------
127  // 強制終了関数
128  bool CThread::Terminate( DWORD dwExitCode ) noexcept {
129  // 処理ブロック
130  bool result = false;
131  do {
132  // スレッドを強制終了する
133  if ( 0 == ::TerminateThread( m_hObject, dwExitCode ) ) {
134  // 失敗!
135  break;
136  }
137 
138  // 成功!
139  result = true;
140  } while ( false );
141 
142  // 実行結果を返す
143  return result;
144  }
145 
146  //-------------------------------------------------------------------------
147  // 終了コード取得関数
148  DWORD CThread::GetExitCode() const noexcept {
149  // 処理ブロック
150  DWORD result = 0;
151  do {
152  // スレッド終了コードを取得する
153  DWORD dwExitCode;
154  if ( 0 == ::GetExitCodeThread( m_hObject, &dwExitCode ) ) {
155  // 失敗!
156  break;
157  }
158 
159  // 成功!
160  result = dwExitCode;
161  } while ( false );
162 
163  // 実行結果を返す
164  return result;
165  }
166 
167  //-------------------------------------------------------------------------
168  // サスペンド関数
169  bool CThread::Suspend() noexcept {
170  // 処理ブロック
171  bool result = false;
172  do {
173  // スレッドをサスペンドする
174  if ( static_cast< DWORD >( -1 ) == ::SuspendThread( m_hObject ) ) {
175  // 失敗!
176  break;
177  }
178 
179  // 成功!
180  result = true;
181  } while ( false );
182 
183  // 実行結果を返す
184  return result;
185  }
186 
187  //-------------------------------------------------------------------------
188  // リジューム関数
189  bool CThread::Resume() noexcept {
190  // 処理ブロック
191  bool result = false;
192  do {
193  // スレッドをリジュームする
194  if ( static_cast< DWORD >( -1 ) == ::ResumeThread( m_hObject ) ) {
195  // 失敗!
196  break;
197  }
198 
199  // 成功!
200  result = true;
201  } while ( false );
202 
203  // 実行結果を返す
204  return result;
205  }
206 }
207 
208 #pragma managed( pop )
virtual void Close() noexcept
クローズ関数
Definition: CSync.cpp:45
スレッドクラスヘッダファイル
virtual bool Release() noexcept override
リリース関数
Definition: CThread.cpp:56
virtual bool Suspend() noexcept
サスペンド関数
Definition: CThread.cpp:169
同期クラス
Definition: CSync.h:30
virtual bool Create(LPTHREAD_START_ROUTINE pfnFunc, LPVOID lpParam) noexcept
作成関数
Definition: CThread.cpp:63
共通ライブラリ名前空間
Definition: CArray.h:23
virtual bool Resume() noexcept
リジューム関数
Definition: CThread.cpp:189
HANDLE m_hObject
オブジェクトハンドル
Definition: CSync.h:152
virtual ~CThread() noexcept
デストラクタ
Definition: CThread.cpp:37
CThread() noexcept
コンストラクタ
Definition: CThread.cpp:28
virtual DWORD GetExitCode() const noexcept
終了コード取得関数
Definition: CThread.cpp:148
virtual void Close() noexcept override
クローズ関数
Definition: CThread.cpp:46
virtual bool Open(DWORD dwThreadId, DWORD dwAccess=THREAD_ALL_ACCESS) noexcept
オープン関数
Definition: CThread.cpp:98
virtual DWORD GetThreadId() const noexcept
スレッドID取得関数
Definition: CThread.h:68
virtual bool Terminate(DWORD dwExitCode=0) noexcept
強制終了関数
Definition: CThread.cpp:128
DWORD m_dwThreadId
スレッドID
Definition: CThread.h:178