+ -
当前位置:首页 → 问答吧 → 用WaitForSingleObject来等待线程退出的问题

用WaitForSingleObject来等待线程退出的问题

时间:2011-12-02

来源:互联网

在OnInitDialog里调用下面的代码创建一个线程

C/C++ code

    CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED);
    m_hThread = pThread->m_hThread; //m_hThread是成员变量
    pThread->ResumeThread();
    TRACE(_T("OnInit, %x\n"), m_hThread);



在OnClose里调用下面的代码等待线程退出

C/C++ code

        TRACE(_T("OnClose, %x\n"), m_hThread);
        DWORD dRes = WaitForSingleObject(m_hThread, INFINITE);//概率性卡在这里,此时线程已退出
        ASSERT(WAIT_OBJECT_0 == dRes || WAIT_FAILED == dRes);



现在的问题是,概率性出现程序一直卡在WaitForSingleObject调用处的情况,此时线程已经结束了,为什么会出现这种情况。

作者: rcbblgy   发布时间: 2011-12-02

线程函数的部分内容
C/C++ code

UINT CRuleBlockCheck::ThreadFunc( LPVOID lpParam )
{
    CString& strPath = *(CString*)lpParam;

    CStdioFile file;
    if (!file.Open(strPath, CFile::modeReadWrite))
    {
        ::PostMessage(m_hDlgWnd, WM_THREAD_MESSAGE, eOpenFail, NULL);
        return 0;
    }

//文件存在,其它操作
}



在OnClose调用时,确定线程已经退出,m_hThread的值也没有被意外修改。
出现卡住的情况,一般都是文件不存在直接return 0返回的时候。

作者: rcbblgy   发布时间: 2011-12-02

C/C++ code
CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED);
m_hThread = pThread->m_hThread; //m_hThread是成员变量
pThread->m_bAutoDelete = FALSE;
pThread->ResumeThread();
TRACE(_T("OnInit, %x\n"), m_hThread);

作者: mousecarrot   发布时间: 2011-12-02

线程退出了,wait应该直接返回啊

作者: ouyh12345   发布时间: 2011-12-02

我也是这么认为的,但是有时它直接返回,有时就卡在那。

作者: rcbblgy   发布时间: 2011-12-02

热门下载

更多