MFC の学習を始めたばかりで、マルチスレッドの理解を深めるためにダイアログ ベースのアプリケーションを 1 つ作成しています。
メイン ダイアログには、プログレス バー、[開始] ボタン、および [キャンセル] ボタンがあります。
開始ボタンをクリックすると、(API 呼び出しを介して) 何らかの処理を行うワーカー スレッドが作成され、メイン スレッドがプログレス バーを処理します。
プログレスバーのステータスを更新および停止するために、いくつかのWindowsメッセージを定義しました
WM_UPDATE_CONTROL
WM_STOP_CONTROL
以下は、これまでに作成したコードです
HWND* phObjectHandle;
CWinThread* thread;
void CprogCtrlDlg::OnBnClickedStart() {
phObjectHandle = new HWND; // Set object handle for Worker thread
*phObjectHandle = GetSafeHwnd();
// create worker thread
if(NULL == (thread = AfxBeginThread(ThreadFunc, phObjectHandle))) {
EndDialog(IDCANCEL);
}
AfxMessageBox(L"Thread started");
// Set Progress bar to marquee
}
void CprogCtrlDlg::OnBnClickedCancel() {
// kill the Worker thread
}
UINT CprogCtrlDlg::ThreadFunc(LPVOID pParam) {
HWND *pObjectHandle = static_cast<HWND *>(pParam);
CprogCtrlImpDlg* threadDlg = (CprogCtrlImpDlg*) pParam;
return threadDlg->ThreadFuncRun(pObjectHandle);
}
UINT CprogCtrlDlg::ThreadFuncRun(HWND* pObjectHandle) {
::PostMessage(*pObjectHandle, WM_UPDATE_CONTROL, 0, 0);
// repetitive API CALL in a loop
::PostMessage(*pObjectHandle, WM_STOP_CONTROL, 0, 0);
AfxMessageBox(L"Thread completed");
return 0;
}
[キャンセル] ボタンがクリックされた場合、親スレッドからワーカー スレッドを終了させたい。
TerminateThread() を使用してみましたが(推奨されたものではありませんでしたが)、スレッドを強制終了できませんでした。
親スレッドからワーカー スレッドを終了することについてコメントし、あなたの考えを共有してください。
Windows 7 で Visual Studio 2010 を使用しています。
ティア