방금 MFC를 배우기 시작했으며 멀티 스레딩에 대한 이해를 돕기 위해 하나의 대화 상자 기반 응용 프로그램을 작성했습니다.부모 스레드에서 작업자 스레드 종료 - MFC
기본 대화 상자에는 진행률 표시 줄, 시작 단추 및 취소 단추가 있습니다.
시작 버튼을 클릭하면 API 호출을 통해 일부 처리를 수행 할 작업자 스레드를 만들고 주 스레드가 진행률 막대를 처리합니다.
내가 진행 표시 줄 상태 아래
WM_UPDATE_CONTROL
WM_STOP_CONTROL
를 업데이트하고 중지하려면 Windows 메시지의 몇 가지를 정의한 내가 만든 코드는 지금까지 내가 종료 할
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()를 사용해 보았지만 (권장되지는 않았지만) 스레드를 죽일 수는 없었습니다.
부모 스레드에서 작업자 스레드 종료에 대한 의견을 말하고 공유하십시오.
나는이 같은 코드 뭔가를 개정 할 윈도우 7
TIA
그냥 빨리 점 : 간단한 진행률 표시 줄 업데이트
, 당신은 내부에 이런 일을 작업 루프를 이벤트 체크 를 넣을 수 있습니다. –@ 로거 예 (사용하는 것은 나쁜 생각입니다.) !!! 방금 문제를 해결할 수 있는지 확인하려고했습니다. – MajorBetaVictory
또한 'delete pObjectHandle'을 수행 할 필요가 없으므로 충돌이 발생할 수 있습니다. 또한 당신은'lParam'을 두 가지 다른 타입으로 캐스팅합니다. 쓰레드 간의 올바른 통신 방법은 이벤트입니다. 이렇게 많은 예가 있습니다. 두려워 거기에 현재 코드 문제가 많이 있습니다 :-( –