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(); // サスペンド解除
}
毎回調べるのが面倒なので記述しておきます。
(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(); // サスペンド解除
}
// ■↑ここまで