多线程 – MFC中的工作线程终止

如果完成工作时间太长,终止工作线程的正确方法是什么?我读过几篇文章,声称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.

最佳答案 正如Sanja已经提到的那样,终止线程是不安全的.在这种情况下,典型的解决方案是生成一个子进程,该进程只有托管DLL并调用方法的角色.您的主进程将通过一些LPC机制与子进程通信,以传递DLL方法调用的参数并返回结果.在超时是非常安全的杀死子进程,内核将回收所有资源,并且不会有内存或系统对象泄漏(可能会持续存在磁盘泄漏,比如遗留的文件).简单地调用DLL(你需要提出进程间通信解决方案)要复杂得多,这是唯一可靠的方法.

点赞