Solution46
LibCommon::CConsoleMenu クラス

コンソールメニュークラス [詳解]

#include "CConsoleMenu.h"

LibCommon::CConsoleMenu の継承関係図
Inheritance graph
LibCommon::CConsoleMenu 連携図
Collaboration graph

クラス

struct  SMenuInfo
 メニュー定義情報構造体 [詳解]
 
struct  SMenuItemInfo
 メニュー項目情報構造体 [詳解]
 

公開メンバ関数

 CConsoleMenu (SMenuInfo const *psMenuInfo) noexcept
 コンストラクタ [詳解]
 
virtual ~CConsoleMenu () noexcept
 デストラクタ [詳解]
 
virtual bool IsExecMenu () noexcept
 実行状態取得関数 [詳解]
 
virtual bool StartMenu () noexcept
 メニュー開始関数 [詳解]
 
virtual bool ExecMenu () noexcept
 メニュー実行関数 [詳解]
 
virtual void StopMenu () noexcept
 メニュー中止要求関数 [詳解]
 
virtual bool WaitForMenuFinish (DWORD dwTime=INFINITE) noexcept
 メニュー終了待ち関数 [詳解]
 
virtual bool CanBeExit () const noexcept
 終了可能状態取得関数 [詳解]
 
virtual CConsoleMenuGetSubMenu () const noexcept
 サブメニュー取得関数 [詳解]
 
virtual bool MenuCallBackProc (bool bPreCallBack=false) noexcept
 メニューコールバック関数 [詳解]
 
- 基底クラス LibCommon::CMutex に属する継承公開メンバ関数
 CMutex () noexcept
 コンストラクタ [詳解]
 
virtual ~CMutex () noexcept
 デストラクタ [詳解]
 
virtual void Close () noexcept override
 クローズ関数 [詳解]
 
virtual bool Release () noexcept override
 リリース関数 [詳解]
 
virtual bool Lock (DWORD dwTime=INFINITE) noexcept override
 ロック関数 [詳解]
 
virtual bool Unlock () noexcept override
 ロック解除関数 [詳解]
 
virtual bool Create (wchar_t const *pszObjectName=nullptr) noexcept
 作成関数 [詳解]
 
virtual bool Open (wchar_t const *pszObjectName) noexcept
 オープン関数 [詳解]
 
- 基底クラス LibCommon::CSync に属する継承公開メンバ関数
 CSync () noexcept
 コンストラクタ [詳解]
 
virtual ~CSync () noexcept
 デストラクタ [詳解]
 
virtual HANDLE GetHandle () const noexcept
 オブジェクトハンドル取得関数 [詳解]
 
virtual bool IsCreate () const noexcept
 新規作成状態取得関数 [詳解]
 
virtual bool Wait (DWORD dwTime=INFINITE) noexcept
 ウェイト関数 [詳解]
 

限定公開メンバ関数

virtual bool ExecSubThread () noexcept
 サブスレッド実行関数 [詳解]
 

静的限定公開メンバ関数

static DWORD WINAPI SubThreadProc (LPVOID lpParam) noexcept
 サブスレッド関数 [詳解]
 

限定公開変数類

SMenuInfo const * m_psMenuInfo
 メニュー定義情報構造体ポインタ [詳解]
 
CEvent m_cEventRequest
 要求イベント [詳解]
 
CEvent m_cEventNotify
 通知イベント [詳解]
 
CEvent m_cEventFinish
 終了イベント [詳解]
 
CThread m_cThreadSub
 サブスレッド [詳解]
 
int m_nMenuIndex
 メニュー項目インデックス [詳解]
 
int m_nRepeat
 リピートカウント [詳解]
 
bool m_bRepeat
 リピート実行フラグ [詳解]
 
bool m_bSubMenu
 サブメニュー要求フラグ [詳解]
 
CConsoleMenum_pcSubMenu
 サブメニューポインタ [詳解]
 
CConsoleMenum_pcParent
 親メニューポインタ [詳解]
 
- 基底クラス LibCommon::CMutex に属する継承限定公開変数類
DWORD m_dwLockCount
 ロックカウント [詳解]
 
- 基底クラス LibCommon::CSync に属する継承限定公開変数類
HANDLE m_hObject
 オブジェクトハンドル [詳解]
 
bool m_bIsCreate
 新規作成フラグ [詳解]
 

静的限定公開変数類

static wchar_t const *const ITEM_KEY_LIST = L"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 項目選択文字リスト [詳解]
 
static bool s_bStopMenu = false
 メニュー中止要求フラグ [詳解]
 
- 基底クラス LibCommon::CMutex に属する継承静的限定公開変数類
static wchar_t const *const OBJECT_NAME_EXT = L".CMutex"
 オブジェクト名拡張子 [詳解]
 

非公開メンバ関数

 CConsoleMenu (CConsoleMenu const &)=delete
 
CConsoleMenuoperator= (CConsoleMenu const &)=delete
 

詳解

コンソールメニュークラス

コンソールメニュークラスです。

注意
なし

CConsoleMenu.h32 行目に定義があります。

構築子と解体子

LibCommon::CConsoleMenu::CConsoleMenu ( SMenuInfo const *  psMenuInfo)
explicitnoexcept

コンストラクタ

コンストラクタです。

引数
[in]psMenuInfoメニュー定義情報構造体ポインタ
戻り値
なし
注意
なし

CConsoleMenu.cpp31 行目に定義があります。

参照先 NotifyFatalError.

33  : CMutex()
34  // メンバ変数初期化
35  , m_psMenuInfo( psMenuInfo )
36  , m_cEventRequest()
37  , m_cEventNotify()
38  , m_cEventFinish()
39  , m_cThreadSub()
40  , m_nMenuIndex( 0 )
41  , m_nRepeat( 0 )
42  , m_bRepeat( false )
43  , m_bSubMenu( false )
44  , m_pcSubMenu( nullptr )
45  , m_pcParent( nullptr )
46  {
47  // 処理ブロック
48  do {
49  // ミューテックスを作成する
50  if ( !Create() ) {
51  // 致命的エラー!
53  break;
54  }
55  // 同期処理ブロック
56  else do {
57  CSyncAuto cSyncAuto( *this );
58 
59  // 要求イベントを作成する
60  if ( !m_cEventRequest.Create() ) {
61  // 致命的エラー!
63  break;
64  }
65  // 通知イベントを作成する
66  else if ( !m_cEventNotify.Create() ) {
67  // 致命的エラー!
69  break;
70  }
71  // 終了イベントを作成する
72  else if ( !m_cEventFinish.Create() ) {
73  // 致命的エラー!
75  break;
76  }
77  } while ( false );
78  } while ( false );
79  }
SMenuInfo const * m_psMenuInfo
メニュー定義情報構造体ポインタ
Definition: CConsoleMenu.h:225
CConsoleMenu * m_pcSubMenu
サブメニューポインタ
Definition: CConsoleMenu.h:234
#define NotifyFatalError()
致命的エラー発生通知マクロ
Definition: LibUtility.h:22
bool m_bRepeat
リピート実行フラグ
Definition: CConsoleMenu.h:232
CThread m_cThreadSub
サブスレッド
Definition: CConsoleMenu.h:229
virtual bool Create(wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CEvent.cpp:44
CEvent m_cEventRequest
要求イベント
Definition: CConsoleMenu.h:226
int m_nRepeat
リピートカウント
Definition: CConsoleMenu.h:231
virtual bool Create(wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CMutex.cpp:143
int m_nMenuIndex
メニュー項目インデックス
Definition: CConsoleMenu.h:230
CMutex() noexcept
コンストラクタ
Definition: CMutex.cpp:29
CEvent m_cEventNotify
通知イベント
Definition: CConsoleMenu.h:227
bool m_bSubMenu
サブメニュー要求フラグ
Definition: CConsoleMenu.h:233
CConsoleMenu * m_pcParent
親メニューポインタ
Definition: CConsoleMenu.h:235
CEvent m_cEventFinish
終了イベント
Definition: CConsoleMenu.h:228
virtual LibCommon::CConsoleMenu::~CConsoleMenu ( )
inlinevirtualnoexcept

デストラクタ

デストラクタです。

引数
なし
戻り値
なし
注意
なし

CConsoleMenu.h84 行目に定義があります。

84 {}
LibCommon::CConsoleMenu::CConsoleMenu ( CConsoleMenu const &  )
privatedelete

関数詳解

virtual bool LibCommon::CConsoleMenu::IsExecMenu ( )
inlinevirtualnoexcept

実行状態取得関数

実行状態取得関数です。

引数
なし
戻り値
実行結果
  • true 実行中
  • false 非実行中
注意
なし

CConsoleMenu.h100 行目に定義があります。

参照元 ExecMenu(), StartMenu(), StopMenu(), AppTest::CAppTest::WmClose().

100 { return ( ( nullptr != m_cThreadSub.GetHandle() ) && !m_cThreadSub.Wait( 0 ) ); }
virtual HANDLE GetHandle() const noexcept
オブジェクトハンドル取得関数
Definition: CSync.h:68
CThread m_cThreadSub
サブスレッド
Definition: CConsoleMenu.h:229
virtual bool Wait(DWORD dwTime=INFINITE) noexcept
ウェイト関数
Definition: CSync.cpp:59

被呼び出し関係図:

bool LibCommon::CConsoleMenu::StartMenu ( )
virtualnoexcept

メニュー開始関数

メニュー開始関数です。

引数
なし
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CConsoleMenu.cpp85 行目に定義があります。

参照先 LibCommon::CThread::Create(), IsExecMenu(), m_cEventFinish, m_cEventNotify, m_cEventRequest, m_cThreadSub, LibCommon::CEvent::Reset(), SubThreadProc().

参照元 AppTest::CAppTest::ExecApp(), ExecMenu().

85  {
86  // 処理ブロック
87  bool result = false;
88  do {
89  // メニュー実行状態を調べる
90  if ( IsExecMenu() ) {
91  // 失敗!
92  break;
93  }
94  // 同期処理ブロック
95  else do {
96  CSyncAuto cSyncAuto( *this );
97 
98  // 要求イベントをリセットする
99  if ( !m_cEventRequest.Reset() ) {
100  // 失敗!
101  break;
102  }
103  // 通知イベントをリセットする
104  else if ( !m_cEventNotify.Reset() ) {
105  // 失敗!
106  break;
107  }
108  // 終了イベントをリセットする
109  else if ( !m_cEventFinish.Reset() ) {
110  // 失敗!
111  break;
112  }
113  // サブスレッドを起動する
114  else if ( !m_cThreadSub.Create( SubThreadProc, this ) ) {
115  // 失敗!
116  break;
117  }
118 
119  // 成功!
120  result = true;
121  } while ( false );
122  } while ( false );
123 
124  // 実行結果を返す
125  return result;
126  }
static DWORD WINAPI SubThreadProc(LPVOID lpParam) noexcept
サブスレッド関数
virtual bool IsExecMenu() noexcept
実行状態取得関数
Definition: CConsoleMenu.h:100
CThread m_cThreadSub
サブスレッド
Definition: CConsoleMenu.h:229
virtual bool Create(LPTHREAD_START_ROUTINE pfnFunc, LPVOID lpParam) noexcept
作成関数
Definition: CThread.cpp:63
CEvent m_cEventRequest
要求イベント
Definition: CConsoleMenu.h:226
virtual bool Reset() noexcept
シグナルリセット関数
Definition: CEvent.cpp:150
CEvent m_cEventNotify
通知イベント
Definition: CConsoleMenu.h:227
CEvent m_cEventFinish
終了イベント
Definition: CConsoleMenu.h:228

呼び出し関係図:

被呼び出し関係図:

bool LibCommon::CConsoleMenu::ExecMenu ( )
virtualnoexcept

メニュー実行関数

メニュー実行関数です。

引数
なし
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CConsoleMenu.cpp152 行目に定義があります。

参照先 ExecMenu(), GetSubMenu(), IsExecMenu(), LibCommon::CSyncAuto::IsLock(), m_bRepeat, m_bSubMenu, m_cEventNotify, m_cEventRequest, m_pcParent, m_pcSubMenu, MenuCallBackProc(), LibCommon::CEvent::Set(), StartMenu(), LibCommon::CSync::Wait().

参照元 ExecMenu(), AppTest::CAppTest::IdleCallBackProc().

152  {
153  // 処理ブロック
154  bool result = false;
155  do {
156  // メニュー実行状態を調べる
157  if ( !IsExecMenu() ) {
158  // 終了!
159  break;
160  }
161  // 同期処理ブロック
162  else do {
163  CSyncAuto cSyncAuto( *this, 0 );
164 
165  // ロック状態を調べる
166  if ( cSyncAuto.IsLock() ) {
167  // サブメニュー要求フラグとサブメニューポインタを調べる
168  if ( !m_bSubMenu && ( nullptr != m_pcSubMenu ) ) {
169  // サブメニューの実行関数を実行する
171  }
172  // 要求イベントを調べる
173  else if ( m_cEventRequest.Wait( 0 ) ) {
174  // サブメニュー要求フラグを調べる
175  if ( m_bSubMenu ) {
176  // サブメニューポインタを調べる
177  if ( nullptr == m_pcSubMenu ) {
178  // サブメニューを取得する
180 
181  // 親メニューポインタを設定する
182  m_pcSubMenu->m_pcParent = this;
183 
184  // サブメニューを開始する
185  if ( !m_pcSubMenu->StartMenu() ) {
186  // サブメニューを削除する
187  delete m_pcSubMenu;
188  m_pcSubMenu = nullptr;
189 
190  // 失敗!
191  break;
192  }
193  }
194  else {
195  // サブメニューを削除する
196  delete m_pcSubMenu;
197  m_pcSubMenu = nullptr;
198  }
199  }
200  else {
201  // メニューコールバック関数を実行する
203  }
204 
205  // 通知イベントをセットする
206  if ( !m_cEventNotify.Set() ) {
207  // 失敗!
208  break;
209  }
210  }
211  }
212 
213  // 成功!
214  result = true;
215  } while ( false );
216  } while ( false );
217 
218  // 実行結果を返す
219  return result;
220  }
CConsoleMenu * m_pcSubMenu
サブメニューポインタ
Definition: CConsoleMenu.h:234
virtual bool StartMenu() noexcept
メニュー開始関数
bool m_bRepeat
リピート実行フラグ
Definition: CConsoleMenu.h:232
virtual bool IsExecMenu() noexcept
実行状態取得関数
Definition: CConsoleMenu.h:100
virtual bool Wait(DWORD dwTime=INFINITE) noexcept
ウェイト関数
Definition: CSync.cpp:59
virtual CConsoleMenu * GetSubMenu() const noexcept
サブメニュー取得関数
Definition: CConsoleMenu.h:177
CEvent m_cEventRequest
要求イベント
Definition: CConsoleMenu.h:226
virtual bool Set() noexcept
シグナルセット関数
Definition: CEvent.cpp:130
CEvent m_cEventNotify
通知イベント
Definition: CConsoleMenu.h:227
virtual bool ExecMenu() noexcept
メニュー実行関数
bool m_bSubMenu
サブメニュー要求フラグ
Definition: CConsoleMenu.h:233
CConsoleMenu * m_pcParent
親メニューポインタ
Definition: CConsoleMenu.h:235
virtual bool MenuCallBackProc(bool bPreCallBack=false) noexcept
メニューコールバック関数
Definition: CConsoleMenu.h:190

呼び出し関係図:

被呼び出し関係図:

void LibCommon::CConsoleMenu::StopMenu ( )
virtualnoexcept

メニュー中止要求関数

メニュー中止要求関数です。

引数
なし
戻り値
入力レコード数
注意
なし

CConsoleMenu.cpp130 行目に定義があります。

参照先 ConsoleLine, ConsoleNewLine, ConsoleStopInput, IsExecMenu(), m_cEventFinish, s_bStopMenu, LibCommon::CSync::Wait().

参照元 AppTest::CAppTest::ExecApp(), AppTest::CAppTest::WmClose().

130  {
131  // メニュー実行状態を調べる
132  if ( IsExecMenu() ) {
133  // コンソール入力の中止を要求する
135 
136  // メニュー中止要求フラグをセットする
137  s_bStopMenu = true;
138 
139  // 終了イベントを待機する
141 
142  // 改行する
143  ConsoleNewLine();
144  ConsoleNewLine();
145  ConsoleLine( L"メニューを中止しました。" );
146  ConsoleNewLine();
147  }
148  }
virtual bool IsExecMenu() noexcept
実行状態取得関数
Definition: CConsoleMenu.h:100
#define ConsoleNewLine()
改行出力マクロ
Definition: CConsole.h:29
virtual bool Wait(DWORD dwTime=INFINITE) noexcept
ウェイト関数
Definition: CSync.cpp:59
#define ConsoleLine(...)
ヘッダインデントなし書式設定文字列行出力マクロ
Definition: CConsole.h:34
static bool s_bStopMenu
メニュー中止要求フラグ
Definition: CConsoleMenu.h:245
#define ConsoleStopInput()
入力中止要求マクロ
Definition: CConsole.h:67
CEvent m_cEventFinish
終了イベント
Definition: CConsoleMenu.h:228

呼び出し関係図:

被呼び出し関係図:

virtual bool LibCommon::CConsoleMenu::WaitForMenuFinish ( DWORD  dwTime = INFINITE)
inlinevirtualnoexcept

メニュー終了待ち関数

メニュー終了待ち関数です。

引数
[in]dwTime待機時間
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CConsoleMenu.h153 行目に定義があります。

参照元 ExecSubThread().

153 { return m_cThreadSub.Wait( dwTime ); }
CThread m_cThreadSub
サブスレッド
Definition: CConsoleMenu.h:229
virtual bool Wait(DWORD dwTime=INFINITE) noexcept
ウェイト関数
Definition: CSync.cpp:59

被呼び出し関係図:

virtual bool LibCommon::CConsoleMenu::CanBeExit ( ) const
inlinevirtualnoexcept

終了可能状態取得関数

終了可能状態取得関数です。

引数
なし
戻り値
実行結果
  • true 終了可能
  • false 終了不可能
注意
なし

CConsoleMenu.h166 行目に定義があります。

参照元 ExecSubThread().

166 { return true; }

被呼び出し関係図:

virtual CConsoleMenu* LibCommon::CConsoleMenu::GetSubMenu ( ) const
inlinevirtualnoexcept

サブメニュー取得関数

サブメニュー取得関数です。

引数
なし
戻り値
コンソールメニュークラスポインタ
注意
なし

AppTest::CAppTestMenuで再実装されています。

CConsoleMenu.h177 行目に定義があります。

参照元 ExecMenu().

177 { return nullptr; }

被呼び出し関係図:

virtual bool LibCommon::CConsoleMenu::MenuCallBackProc ( bool  bPreCallBack = false)
inlinevirtualnoexcept

メニューコールバック関数

メニューコールバック関数です。

引数
[in]bPreCallBack事前コールバックフラグ
戻り値
実行結果
  • true 継続
  • false 中止
注意
なし

AppTest::CAppTestMenuConsole, AppTest::CAppTestMenuWindowで再実装されています。

CConsoleMenu.h190 行目に定義があります。

参照元 ExecMenu(), ExecSubThread().

190 { return bPreCallBack; }

被呼び出し関係図:

bool LibCommon::CConsoleMenu::ExecSubThread ( )
protectedvirtualnoexcept

サブスレッド実行関数

サブスレッド実行関数です。

引数
なし
戻り値
実行結果
  • true 成功
  • false 失敗
注意
なし

CConsoleMenu.cpp226 行目に定義があります。

参照先 CanBeExit(), ConsoleInputChar, ConsoleLine, ConsoleNewLine, ConsoleString, ConsoleYesNo, ITEM_KEY_LIST, m_bRepeat, LibCommon::CConsoleMenu::SMenuItemInfo::m_bSubMenu, m_bSubMenu, m_cEventNotify, m_cEventRequest, LibCommon::CConsoleMenu::SMenuInfo::m_nCount, m_nMenuIndex, m_nRepeat, m_pcParent, m_pcSubMenu, LibCommon::CConsoleMenu::SMenuInfo::m_psItemInfo, m_psMenuInfo, LibCommon::CConsoleMenu::SMenuItemInfo::m_pszItemName, LibCommon::CConsoleMenu::SMenuInfo::m_pszName, MenuCallBackProc(), s_bStopMenu, LibCommon::CEvent::Set(), LibCommon::CSync::Wait(), WaitForMenuFinish() (計26項目).

参照元 SubThreadProc().

226  {
227  // 同期処理ブロック
228  bool result = false;
229  do {
230  // サブメニュー要求フラグをクリアする
231  m_bSubMenu = false;
232 
233  // 同期処理ブロック
234  do {
235  CSyncAuto cSyncAuto( *this );
236 
237  // リピート実行フラグを調べる
238  if ( m_bRepeat ) {
239  // リピートカウントをインクリメントする
240  ++m_nRepeat;
241 
242  // 事前メニューコールバック関数を実行する
243  if ( MenuCallBackProc( true ) ) {
244  // 成功!
245  result = true;
246  break;
247  }
248  }
249 
250  // リピートカウントをクリアする
251  m_nRepeat = 0;
252 
253  // リピート実行フラグをクリアする
254  m_bRepeat = false;
255 
256  // 巡回する
257  for ( bool bInitialize = true;; ) {
258  // 初期化フラグを調べる
259  if ( bInitialize ) {
260  // 初期化フラグをクリアする
261  bInitialize = false;
262 
263  // メニュー名称を表示する
264  ConsoleLine( L"//=========================================================================" );
265  ConsoleLine( L"// %s", m_psMenuInfo->m_pszName );
266 
267  // メニュー項目を表示する
268  for ( int nIndex = 0; m_psMenuInfo->m_nCount > nIndex; ++nIndex ) {
269  // メニュー項目名称を表示する
270  ConsoleLine( L"%4c: %s", ITEM_KEY_LIST[ nIndex ], m_psMenuInfo->m_psItemInfo[ nIndex ].m_pszItemName );
271  }
272 
273  // 親メニューポインタを調べる
274  if ( nullptr == m_pcParent ) {
275  // 中止項目を表示する
276  ConsoleLine( L" ESC: 終了" );
277  }
278  else {
279  // 戻る項目を表示する
280  ConsoleLine( L" ESC: 戻る" );
281  }
282 
283  // 入力待ちを表示する
284  ConsoleString( L"選択: " );
285  }
286 
287  // 1文字入力する
288  wchar_t ch = L'\0';
289  if ( !ConsoleInputChar( ch ) ) {
290  // 失敗!
291  break;
292  }
293  // メニュー中止要求フラグを調べる
294  else if ( s_bStopMenu ) {
295  // 終了!
296  break;
297  }
298  // 文字コードを調べる
299  else if ( L'\033' == ch ) {
300  // 終了可能か調べる
301  ConsoleLine( L"ESC" );
302  ConsoleNewLine();
303  if ( !CanBeExit() ) {
304  // 初期化フラグをセットする
305  bInitialize = true;
306 
307  // 継続!
308  continue;
309  }
310  // 親メニューポインタを調べる
311  else if ( nullptr == m_pcParent ) {
312  // 確認する
313  if ( !ConsoleYesNo( L"メニューを終了しますか?" ) ) {
314  // 初期化フラグをセットする
315  bInitialize = true;
316 
317  // 継続!
318  ConsoleNewLine();
319  continue;
320  }
321  ConsoleNewLine();
322  }
323 
324  // 終了!
325  break;
326  }
327 
328  // インデックス文字コードを調べる
329  wchar_t const* pszIndex = ::wcschr( ITEM_KEY_LIST, ::towupper( ch ) );
330  if ( nullptr == pszIndex ) {
331  // 継続!
332  continue;
333  }
334 
335  // メニュー項目インデックスを取得する
336  m_nMenuIndex = static_cast< int >( pszIndex - ITEM_KEY_LIST );
337  if ( m_psMenuInfo->m_nCount <= m_nMenuIndex ) {
338  // 継続!
339  continue;
340  }
342  ConsoleNewLine();
343 
344  // サブメニューか調べる
346  // サブメニュー要求フラグをセットする
347  m_bSubMenu = true;
348  break;
349  }
350  else {
351  // メニュー項目タイトルを表示する
352  ConsoleLine( L"//-------------------------------------------------------------------------" );
354  ConsoleNewLine();
355 
356  // 事前メニューコールバック関数を実行する
357  if ( !MenuCallBackProc( true ) ) {
358  // 初期化フラグをセットする
359  bInitialize = true;
360 
361  // 継続!
362  continue;
363  }
364  }
365 
366  // 成功!
367  result = true;
368  break;
369  }
370  } while ( false );
371 
372  // サブメニュー要求フラグを調べる
373  if ( m_bSubMenu ) {
374  // 要求イベントをセットする
375  if ( !m_cEventRequest.Set() ) {
376  // 失敗!
377  break;
378  }
379  // 通知イベントを待機する
380  else if ( !m_cEventNotify.Wait() ) {
381  // 失敗!
382  break;
383  }
384 
385  // サブメニュー要求フラグをクリアする
386  m_bSubMenu = false;
387 
388  // サブメニューポインタを調べる
389  if ( nullptr == m_pcSubMenu ) {
390  // 失敗!
391  break;
392  }
393  // サブメニューが終了するまで待機する
394  else if ( !m_pcSubMenu->WaitForMenuFinish() ) {
395  // 失敗!
396  break;
397  }
398  // メニュー中止要求フラグを調べる
399  else if ( s_bStopMenu ) {
400  // 終了!
401  break;
402  }
403 
404  // サブメニュー要求フラグをセットする
405  m_bSubMenu = true;
406 
407  // 要求イベントをセットする
408  if ( !m_cEventRequest.Set() ) {
409  // 失敗!
410  break;
411  }
412  // 通知イベントを待機する
413  else if ( !m_cEventNotify.Wait() ) {
414  // 失敗!
415  break;
416  }
417 
418  // サブメニュー要求フラグをクリアする
419  m_bSubMenu = false;
420 
421  // サブメニューポインタを調べる
422  if ( nullptr != m_pcSubMenu ) {
423  // 失敗!
424  break;
425  }
426 
427  // 成功!
428  result = true;
429  break;
430  }
431  // 実行結果を調べる
432  else if ( !result ) {
433  // 失敗!
434  break;
435  }
436  // 要求イベントをセットする
437  else if ( !m_cEventRequest.Set() ) {
438  // 失敗!
439  break;
440  }
441  // 通知イベントを待機する
442  else if ( !m_cEventNotify.Wait() ) {
443  // 失敗!
444  break;
445  }
446  } while ( false );
447 
448  // 実行結果を返す
449  return result;
450  }
SMenuInfo const * m_psMenuInfo
メニュー定義情報構造体ポインタ
Definition: CConsoleMenu.h:225
CConsoleMenu * m_pcSubMenu
サブメニューポインタ
Definition: CConsoleMenu.h:234
virtual bool CanBeExit() const noexcept
終了可能状態取得関数
Definition: CConsoleMenu.h:166
bool m_bRepeat
リピート実行フラグ
Definition: CConsoleMenu.h:232
bool m_bSubMenu
サブメニューフラグ
Definition: CConsoleMenu.h:45
#define ConsoleYesNo(...)
確認入力待ちマクロ
Definition: CConsole.h:66
virtual bool WaitForMenuFinish(DWORD dwTime=INFINITE) noexcept
メニュー終了待ち関数
Definition: CConsoleMenu.h:153
#define ConsoleNewLine()
改行出力マクロ
Definition: CConsole.h:29
virtual bool Wait(DWORD dwTime=INFINITE) noexcept
ウェイト関数
Definition: CSync.cpp:59
int const m_nCount
メニュー項目数
Definition: CConsoleMenu.h:57
CEvent m_cEventRequest
要求イベント
Definition: CConsoleMenu.h:226
int m_nRepeat
リピートカウント
Definition: CConsoleMenu.h:231
static wchar_t const *const ITEM_KEY_LIST
項目選択文字リスト
Definition: CConsoleMenu.h:240
int m_nMenuIndex
メニュー項目インデックス
Definition: CConsoleMenu.h:230
virtual bool Set() noexcept
シグナルセット関数
Definition: CEvent.cpp:130
#define ConsoleString(...)
文字列出力マクロ
Definition: CConsole.h:27
wchar_t const *const m_pszItemName
項目名称
Definition: CConsoleMenu.h:44
CEvent m_cEventNotify
通知イベント
Definition: CConsoleMenu.h:227
#define ConsoleLine(...)
ヘッダインデントなし書式設定文字列行出力マクロ
Definition: CConsole.h:34
static bool s_bStopMenu
メニュー中止要求フラグ
Definition: CConsoleMenu.h:245
bool m_bSubMenu
サブメニュー要求フラグ
Definition: CConsoleMenu.h:233
SMenuItemInfo const * m_psItemInfo
メニュー項目情報構造体配列ポインタ
Definition: CConsoleMenu.h:58
#define ConsoleInputChar(...)
1文字入力マクロ
Definition: CConsole.h:60
CConsoleMenu * m_pcParent
親メニューポインタ
Definition: CConsoleMenu.h:235
virtual bool MenuCallBackProc(bool bPreCallBack=false) noexcept
メニューコールバック関数
Definition: CConsoleMenu.h:190
wchar_t const *const m_pszName
メニュー名称
Definition: CConsoleMenu.h:56

呼び出し関係図:

被呼び出し関係図:

DWORD LibCommon::CConsoleMenu::SubThreadProc ( LPVOID  lpParam)
staticprotectednoexcept

サブスレッド関数

サブスレッド関数です。

引数
[in]lpParam引数ポインタ
戻り値
終了コード
注意
なし

CConsoleMenu.cpp456 行目に定義があります。

参照先 ExecSubThread(), ITEM_KEY_LIST, m_cEventFinish, NotifyFatalError, s_bStopMenu, LibCommon::CEvent::Set().

参照元 StartMenu().

456  {
457  // 処理ブロック
458  DWORD result = 0;
459  do {
460  // インスタンスポインタを取得する
461  CConsoleMenu*& rpcInstance = reinterpret_cast< CConsoleMenu*& >( lpParam );
462  if ( nullptr == rpcInstance ) {
463  // 致命的エラー!
465  break;
466  }
467  // 巡回する
468  else for ( ;; ) {
469  // サブスレッド実行関数を実行する
470  if ( !rpcInstance->ExecSubThread() ) {
471  // 終了!
472  break;
473  }
474  }
475 
476  // 終了イベントをセットする
477  rpcInstance->m_cEventFinish.Set();
478  } while ( false );
479 
480  // 実行結果を返す
481  return result;
482  }
#define NotifyFatalError()
致命的エラー発生通知マクロ
Definition: LibUtility.h:22
CConsoleMenu(SMenuInfo const *psMenuInfo) noexcept
コンストラクタ

呼び出し関係図:

被呼び出し関係図:

CConsoleMenu& LibCommon::CConsoleMenu::operator= ( CConsoleMenu const &  )
privatedelete

メンバ詳解

SMenuInfo const* LibCommon::CConsoleMenu::m_psMenuInfo
protected

メニュー定義情報構造体ポインタ

CConsoleMenu.h225 行目に定義があります。

参照元 ExecSubThread().

CEvent LibCommon::CConsoleMenu::m_cEventRequest
protected

要求イベント

CConsoleMenu.h226 行目に定義があります。

参照元 ExecMenu(), ExecSubThread(), StartMenu().

CEvent LibCommon::CConsoleMenu::m_cEventNotify
protected

通知イベント

CConsoleMenu.h227 行目に定義があります。

参照元 ExecMenu(), ExecSubThread(), StartMenu().

CEvent LibCommon::CConsoleMenu::m_cEventFinish
protected

終了イベント

CConsoleMenu.h228 行目に定義があります。

参照元 StartMenu(), StopMenu(), SubThreadProc().

CThread LibCommon::CConsoleMenu::m_cThreadSub
protected

サブスレッド

CConsoleMenu.h229 行目に定義があります。

参照元 StartMenu().

int LibCommon::CConsoleMenu::m_nMenuIndex
protected
int LibCommon::CConsoleMenu::m_nRepeat
protected

リピートカウント

CConsoleMenu.h231 行目に定義があります。

参照元 ExecSubThread().

bool LibCommon::CConsoleMenu::m_bRepeat
protected

リピート実行フラグ

CConsoleMenu.h232 行目に定義があります。

参照元 ExecMenu(), ExecSubThread().

bool LibCommon::CConsoleMenu::m_bSubMenu
protected

サブメニュー要求フラグ

CConsoleMenu.h233 行目に定義があります。

参照元 ExecMenu(), ExecSubThread().

CConsoleMenu* LibCommon::CConsoleMenu::m_pcSubMenu
protected

サブメニューポインタ

CConsoleMenu.h234 行目に定義があります。

参照元 ExecMenu(), ExecSubThread().

CConsoleMenu* LibCommon::CConsoleMenu::m_pcParent
protected

親メニューポインタ

CConsoleMenu.h235 行目に定義があります。

参照元 ExecMenu(), ExecSubThread().

wchar_t const *const LibCommon::CConsoleMenu::ITEM_KEY_LIST = L"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
staticprotected

項目選択文字リスト

CConsoleMenu.h240 行目に定義があります。

参照元 ExecSubThread(), SubThreadProc().

bool LibCommon::CConsoleMenu::s_bStopMenu = false
staticprotected

メニュー中止要求フラグ

CConsoleMenu.h245 行目に定義があります。

参照元 ExecSubThread(), StopMenu(), SubThreadProc().


このクラス詳解は次のファイルから抽出されました: