작업자 스레드를 완료하는 데 너무 오랜 시간이 걸리는 경우 올바른 방법은 무엇입니까? 나는 TerminateThread가 극도의주의를 기울여 사용되어야한다고 주장하는 몇몇 기사를 읽었지만 실행 가능한 대안을 찾을 수는 없습니다.MFC에서 작업자 스레드 종료
Psudo 코드 :
void CMyDialog::RunThread()
{
CWinThread* pThread; // pointer to thread
DWORD dwWaitResult; // result of waiting for thread
// start thread
pThread = AfxBeginThread(beginThread, this,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pThread->m_bAutoDelete = FALSE;
pThread->ResumeThread();
// wait for thread to return
dwWaitResult = ::WaitForSingleObject(pThread->m_hThread, (30 * 1000));
switch (dwWaitResult)
{
case WAIT_OBJECT_0:
delete pThread;
// success, continue
break;
case WAIT_TIMEOUT:
// thread taking too long, terminate it
TerminateThread(pThread->m_hThread, 0);
delete pThread;
break;
} // end switch on wait result
}
UINT CMyDialog::beginThread(LPVOID pParam)
{
// convert parameter back to dialog object and call method
CMyDialog* dlg = (CMyDialog*) pParam;
dlg->readDuration();
return 0;
} // end beginThread
void CMyDialog::readDuration()
{
// call a dll function that may take longer than we are prepared to wait,
// or even hang
} // end readDuration
이 만족할 만합니까? 모든 의견과 제안이 감사하게 받아 들여졌습니다. 그 안전하지를 TerminateThread를 사용하고 약간의 누수가 발생할 수 XP, 비스타, 7
답장을 보내 주셔서 감사합니다. 당신은 조금 더 설명 할 수 있을까요? LPC는 로컬 프로 시저 호출을 의미합니까? 그리고 자식 프로세스에 관해서 이야기 할 때 작업자 스레드가 아니라 완전히 별도의 exe를 의미합니까? –
예, LPC는 모든 로컬 프로세스 간 통신 (COM, 공유 메모리, 네트워크 파이프, WCF 등을 사용하여 구현할 수 있음)을 의미합니다. 별도의 프로세스는 일반적으로 다른 .exe이지만 기술적으로는 동일한 .exe가 다른 매개 변수로 다시 시작될 수 있습니다. Prefferably 별도 .exe –
감사합니다, 그게 가장 도움이되었다. –