スレッドの再開
MFCでアプリケーションを開発しています。
メインのプログラムを走らせながら計算処理を行いたくて、本やネット等のサンプルプログラムを見ながら別スレッドを生成してみました。
OnInitDialog()でイベントとスレッドを生成し、スタートボタンのクリック押下をトリガーとして、計算処理(Run())を呼んでいます。
タイマー開始後は一定時間ごと(サンプルでは500msec)にスレッドを再開して計算処理を実行し、計算処理完了後はスレッドを一時停止状態にしたいと思っています。
(アプリケーション起動時にサスペンドモードで起動したスレッドをボタン押下でResumeThread(再開)し、あとはタイマーでイベントシグナルをセットして制御するつもりでした。)
ですが、下記のコードで走らせると、初回のみ計算処理が呼び出され、その後はスレッドが再開されません(ThreadProc()がコールされない)。
理解不足から何か考え違いをしているのだと思うのですが、どこをなおすべきかわからず行き詰まっています。
どなたかご指摘頂けたらと思います。よろしくお願い致します。
※実際に記述したコードの抜粋になりますので計算やリソースの解放処理等は省略しています。
OS:Win10
開発環境:VisualStudio2015 C++
----------------------------------------------------------------
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
中略
…
m_hEvent = CreateEventA(NULL, FALSE, FALSE, "EVENT");
m_hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, CREATE_SUSPENDED, NULL);
return TRUE;
}
void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
switch(nIDEvent)
{
case 1:
{
BOOL blRet = SetEvent(m_hEvent);
}
break;
default:
{
}
break;
}
CDialog::OnTimer(nIDEvent);
}
UINT CMFCApplication1Dlg::ThreadProc(LPVOID pParam)
{
CMFCApplication1Dlg* pDlg = dynamic_cast<CMFCApplication1Dlg*>(reinterpret_cast<CWnd*>(pParam));
if(pDlg)
{
pDlg->ThreadProcCall();
}
return 0;
}
// LineProfileスレッド処理呼び出し.
void CMFCApplication1Dlg::ThreadProcCall(void)
{
// イベントオブジェクト取得.
HANDLE h = OpenEventA(EVENT_ALL_ACCESS, FALSE, "EVENT");
// シグナル状態になるまで待機.
WaitForSingleObject(h, INFINITE);
// 非シグナル状態に.
ResetEvent(h);
// 計算処理呼び出し.
Run();
this->SendMessage(WM_USER_COMPLETE_PROC);
}
void CMFCApplication1Dlg::Run(void)
{
// 計算処理.
}
// LineProfileスレッド終了後処理.
afx_msg LRESULT CMFCApplication1Dlg::OnCompleteProc(WPARAM wParam, LPARAM lParam)
{
// スレッド停止.
DWORD dwRet = SuspendThread(m_hThread);
return 0;
}
void CMFCApplication1Dlg::OnBnClickedBtnStart()
{
// スレッド再開.
DWORD dwRet = ResumeThread(m_hThread);
// 計算処理呼び出し用タイマー設定.
m_nUpdatePaintTimer = SetTimer(1, 500, NULL);
}