2015年11月16日月曜日

MFCマルチスレッド作成方法

MFCでマルチスレッドを作成する方法をよく忘れてしまいます。
毎回調べるのが面倒なので記述しておきます。
(Visual Studio 6.0版)

(1)Thread_smpDlg.cpp : OnInitDialog() の中に追加する

BOOL CThread_smpDlg::OnInitDialog()
{

// TODO: 特別な初期化を行う時はこの場所に追加してください。
// ■↓ここから追加
ThreadInit();
 // ■↑ここまで
return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
}


(2)Thread_smpDlg.h : の protected: の下に追加する

protected:
HICON m_hIcon;

// ■↓ここから追加
private:
//-----------------------------
// テーブル宣言
//-----------------------------
HANDLE m_hEventStop;
CWinThread* m_pThread;

//-----------------------------
// スレッドエントリー
//-----------------------------
static UINT ThreadEntry(LPVOID pParam)
{
    CThread_smpDlg* pHogeHoge = (CThread_smpDlg*)pParam; // 自オブジェクトの取得
   
    return pHogeHoge->ThreadProc(); // スレッド処理
}
//-----------------------------
// スレッド処理
//-----------------------------
UINT ThreadProc(void)
{
    // 終了イベントがセットされるまでループ
    while ( ::WaitForSingleObject(m_hEventStop, 0) == WAIT_TIMEOUT )
    {
// ■ここに処理を書く
    }
    return 0;
}
//-----------------------------
// スレッド初期化
// OnInitDialog() からコールする
//-----------------------------
void ThreadInit()
{
    m_hEventStop = ::CreateEvent(NULL, TRUE, FALSE, NULL);
    m_pThread = NULL; // スレッドオブジェクトのポインタクリア

    ASSERT(m_pThread == NULL);
   
    // サスペンド状態でスレッドを作成
    m_pThread = ::AfxBeginThread(ThreadEntry, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);
    m_pThread->m_bAutoDelete = FALSE; // 自動破棄フラグクリア
    m_pThread->ResumeThread(); // サスペンド解除
}
 // ■↑ここまで