95 m_lisDef.pDisp =
this;
96 m_piListener = &m_lisDef;
114 m_piListener = (piListener != NULL) ? piListener : &m_lisDef;
135 return m_thread.
GetId();
146 m_isDispatching =
false;
152 if ( lpszName == NULL) { lpszName = _T(
"ThreadDispatch:MessagePump"); }
154 if ( m_thread.
Start(lpszName) )
156 DWORD dwTick = ::GetTickCount();
157 while ( (::GetTickCount() - dwTick) < 5000 )
177 m_isDispatching =
false;
181 return m_thread.
Stop();
204 bool PostMessage(UINT nMsg, WPARAM wParam = 0, LPARAM lParam = 0)
const
220 return m_isDispatching;
237 ASSERT0(
false,
"CThreadDispatch",
"継承もリスナ登録も行われずに使用されています。");
250 ASSERT0(
false,
"CThreadDispatch",
"継承もリスナ登録も行われずに使用されています。");
264 IListener* m_piListener;
265 bool m_isDispatching;
271 virtual void OnSetupThread(
void)
273 if ( m_piListener != NULL )
275 m_piListener->OnThreadDispatchSetup();
283 virtual DWORD Run(
void)
286 while ( ::GetMessage(&msg, NULL, 0, 0) > 0 )
288 if ( msg.message != WM_NULL && m_piListener != NULL )
290 m_isDispatching =
true;
291 bool r = m_piListener->OnThreadDispatchReceive(msg.message, msg.wParam, msg.lParam);
292 m_isDispatching =
false;
299 ::TranslateMessage(&msg);
300 ::DispatchMessage(&msg);
304 ASSERTLIB(msg.message == WM_QUIT);
305 if ( m_piListener != NULL )
307 m_isDispatching =
true;
308 m_piListener->OnThreadDispatchReceive(msg.message, msg.wParam, msg.lParam);
309 m_isDispatching =
false;
317 struct TDefaultListener : IListener
349template<
size_t COUNT>
389 m_in.pListener = NULL;
392 m_in.tasks[i].SetListener(&m_in);
393 m_in.isTaskWorking[i] =
false;
419 tn = (i + m_in.taskIndex) % COUNT;
420 if ( ! m_in.isTaskWorking[tn] )
425 m_in.isTaskWorking[tn] =
true;
426 m_in.tasks[tn].PostMessage(msg, wParam, tn);
441 m_in.isTaskWorking[index] =
true;
442 m_in.tasks[index].PostMessage(msg, wParam, index);
457 m_in.isTaskWorking[i] =
false;
459 r &= m_in.tasks[i].Start(
CStr::Fmt(_T(
"CMultiDispatch-%d"), i + 1));
461 r &= m_in.tasks[i].Start();
476 m_in.tasks[i].Stop();
477 m_in.isTaskWorking[i] =
false;
486 IParentListener* pListener;
488 bool isTaskWorking[COUNT];
492 virtual bool OnThreadDispatchReceive(UINT nMsg, WPARAM wParam, LPARAM lParam)
494 TRACE1(
"OnMultiDispatch-%d\n", lParam + 1);
495 if ( pListener != NULL )
497 pListener->OnMultiDispatchReceive(nMsg, wParam);
499 isTaskWorking[lParam] =
false;
#define loop(VAR, CNT)
loop構文.
void Stop(void)
[設定] スレッド停止
bool Start(void)
[設定] スレッド開始
CMultiThreadDispatchT(void)
コンストラクタ
void PostMessage(UINT msg, WPARAM wParam=0)
[送信] メッセージ送信.
void SetListener(IListener *l)
[設定] リスナー登録.
void PostMessageToOne(INDEX index, UINT msg, WPARAM wParam=0)
[送信] メッセージ送信.
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
CThreadStatus & ReferThreadStatus(void)
[参照] 処理スレッド状態参照.
bool PostMessage(UINT nMsg, WPARAM wParam=0, LPARAM lParam=0) const
[設定] スレッドへPostMessage
bool IsDispatching(void) const
[確認] 処理中?
bool SetPriority(int priority)
[設定] 優先度設定.
void SetListener(IListener *piListener)
[登録] リスナー登録
virtual void OnThreadDispatchSetup(void)
[通知] 開始通知.
virtual ~CThreadDispatch(void)
デストラクタ
bool IsAlive(void) const
[確認] スレッドが生きているか
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
virtual bool OnThreadDispatchReceive(UINT nMsg, WPARAM wParam, LPARAM lParam)
[通知] メッセージ受信.
DWORD GetThreadId(void) const
[取得] スレッドのID取得
bool Stop(void)
[設定] スレッド停止
CThreadDispatch(void)
コンストラクタ
bool PostMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0) const
[実行] PostThreadメッセージ
bool IsAlive(void) const
[確認] スレッドが生きているか
DWORD GetId(void) const
[取得] スレッドのID取得
bool SetPriority(int priority=THREAD_PRIORITY_NORMAL)
[設定] 優先度設定
bool SetRunner(IRunner *pRunner)
[設定] ランナー、設定
bool Stop(DWORD dwWait=15000)
[設定] スレッド停止 スレッドに対して停止要求します。
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
virtual ~IListener(void)
デストラクタ
virtual bool OnMultiDispatchReceive(UINT nMsg, WPARAM wParam)=0
[通知] メッセージ受信.
virtual ~IListener(void)
デストラクタ
virtual void OnThreadDispatchSetup(void)
[通知] 開始通知.
virtual bool OnThreadDispatchReceive(UINT nMsg, WPARAM wParam, LPARAM lParam)=0
[通知] メッセージ受信.