Я только начал изучать 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 () (хотя это не было предложено), но мне не удалось убить поток.
Прокомментируйте и поделитесь своими мыслями о завершении рабочего потока из родительского потока.
Я использую Visual Studio 2010 в Windows 7
TIA
TerminateThread
. - person Roger Rowland   schedule 14.01.2014delete pObjectHandle
, вы, вероятно, разобьетесь. Также вы преобразуете свойlParam
в два разных типа, что не сработает. Правильный способ связи между потоками - это события. На SO есть много примеров. Боюсь, с вашим текущим кодом много проблем :-( - person Roger Rowland   schedule 14.01.2014