如果工作线程需要很长时间才能完成,那么终止工作线程的正确方法是什么?我读过几篇文章,声称TerminateThread应该极其谨慎使用,但我找不到任何可行的替代方案。
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
这可以接受吗?所有意见和建议都感激不尽。
我在Visual Studio 2008中使用MFC / C ++。在Vista上开发,针对XP,Vista和7。
答案 0 :(得分:1)
使用TerminateThread是一个不好的主意,它不安全并且可能导致一些泄漏。您可以使用事件来告诉您的线程结束。 一些有用的链接
答案 1 :(得分:1)
终止线程是不安全的,正如Sanja已经提到的那样。在这种情况下,典型的解决方案是生成一个子进程,该进程只有托管DLL并调用方法的角色。您的主进程将通过一些LPC机制与子进程通信,以传递DLL方法调用的参数并返回结果。在超时是非常安全的杀死子进程,内核将回收所有资源,并且不会有内存或系统对象泄漏(可能会持续存在磁盘泄漏,比如遗留的文件)。简单地调用DLL(你需要提出进程间通信解决方案)要复杂得多,这是唯一可靠的方法。