C++とマルチスレッドを組み合わせて使用するときに生じた疑問
「スレッド関数も変数とともにカプセル化できないか」,に関しての調査結果.

基本的にスレッド関数はコンストラクと以前から存在していなければならないため,グローバル関数にするか,staticなメンバ関数にする必要がある.
しかしstaticなメンバ関数にした場合,そのスレッド関数から自分のメンバ変数,メンバ関数にアクセスできないという制限があるため設計に悩むことが多い

下記のようなクラスとすることでこの制限を回避可能である.

class CMyThread
{
private:
	CWinThread*	m_pThread;
public:
	void 		Stop();
	CWinThread*       Start();
	// スレッド関連
	UINT		ThreadProc(LPVOID pParam);
	static UINT	ThreadProc2(LPVOID pParam);
	                  CMyThread();
	virtual           ~CMyThread();
};
UINT CMyThread::ThreadProc2(LPVOID pParam)
{
    CMyThread*	p	= (CMyThread*)pParam;
    return p->ThreadProc(pParam);
}
CWinThread* CMyThread::StartThread()
{
    this->m_pThread	= ::AfxBeginThread(ThreadProc2, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    this->m_pThread->m_bAutoDelete	= FALSE;
    this->m_pThread->ResumeThread();
    return this->m_pThread;
}
void CMyThread::StopThread()
{
    if(!this->m_pThread){
	return;
    }

    DWORD	dwCode;
    LONG     	ret	= ::GetExitCodeThread( this->m_pThread->m_hThread, &dwCode );// スレッドの状態をdwCodeに返すAPI
    if ( ret && dwCode == STILL_ACTIVE ) {

      // 停止フラグをセットする
      this->m_Run	= STATUS_END;

      // そのスレッドが死ぬのを待つ
      ::WaitForSingleObject(this->m_pThread->m_hThread, INFINITE);
    }
    delete	this->m_pThread;
    this->m_pThread	= NULL;
    return;
}
UINT CMyThread::ThreadProc(LPVOID pParam)
{
	CMyThread*	arg	= (CMyThread*)pParam; 

	while(m_Run != STATUS_END){
            //ワーカスレッドとしての処理 
	}

	return 0;
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Mon, 19 Dec 2005 14:52:04 JST (4659d)