我刚开始学习MFC,并正在编写一个基于对话框的应用程序,以更好地理解多线程。
主对话框包括进度条、启动按钮和取消按钮。
点击启动按钮后,我创建了一个工作线程来进行一些处理(通过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。
谢谢提前。
TerminateThread
。 - Roger Rowlanddelete pObjectHandle
,否则你可能会崩溃。此外,你将lParam
强制转换为两种不同的类型,这是行不通的。在线程之间进行通信的正确方法是使用事件。在 SO 上有许多示例。恐怕你当前的代码存在很多问题 :-( - Roger Rowland