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

rcbblgy 2011-12-02 05:37:42
在OnInitDialog里调用下面的代码创建一个线程


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里调用下面的代码等待线程退出


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


现在的问题是,概率性出现程序一直卡在WaitForSingleObject调用处的情况,此时线程已经结束了,为什么会出现这种情况。
...全文
1029 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
昨夜无风 2011-12-04
  • 打赏
  • 举报
回复
生成的地方

m_pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED); //m_pThread是成员变量
m_pThread->m_bAutoDelete = FALSE;
m_pThread->ResumeThread();


退出的地方:

DWORD dRes = WaitForSingleObject(m_pThread->m_hThread, INFINITE);
m_pThread->m_bAutoDelete = TRUE;

rcbblgy 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sky101010ws 的回复:]
If this handle is closed while the wait is still pending, the function's behavior is undefined.
WaitForSingleObject中参数Handle的解释
行为未定义,则可能退出也可能不退出
按概率应当是一半一半
[/Quote]
貌似是这样的,不过我好像在windows核心编程上看到过我现在的这种用法,所以才这样写的,记不太清楚了
rcbblgy 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yuucyf 的回复:]
引用楼主 rcbblgy 的回复:
在OnInitDialog里调用下面的代码创建一个线程


C/C++ code

CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED);
m_hThread = pThread->m_hThread……
[/Quote]

确定退出了。在OnClose里设断点,看到只有主线程存在了。
rcbblgy 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sky101010ws 的回复:]
引用 5 楼 rcbblgy 的回复:

引用 2 楼 mousecarrot 的回复:
C/C++ code
CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED);
m_hThread = pThread->m_hThread; ……
[/Quote]

pThread->m_bAutoDelete = FALSE;

这样的话,是要手动删除线程资源的
yuucyf 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 rcbblgy 的回复:]
在OnInitDialog里调用下面的代码创建一个线程


C/C++ code

CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED);
m_hThread = pThread->m_hThread; //m_hThread是成……
[/Quote]
你确定你的进程已经退出了吗?
ThreadFunc函数是不是一定会退出,里面没有涉及到所谓的死循环之类的吧?
龙行天下之Sky 2011-12-02
  • 打赏
  • 举报
回复
If this handle is closed while the wait is still pending, the function's behavior is undefined.
WaitForSingleObject中参数Handle的解释
行为未定义,则可能退出也可能不退出
按概率应当是一半一半
龙行天下之Sky 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rcbblgy 的回复:]

引用 2 楼 mousecarrot 的回复:
C/C++ code
CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED);
m_hThread = pThread->m_hThread; //m_hThread是成员变量
pThread-……
[/Quote]
不会,只是简单的赋值,并不会产生句柄泄露
rcbblgy 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mousecarrot 的回复:]
C/C++ code
CWinThread *pThread = AfxBeginThread(ThreadFunc, (LPVOID)&m_strFilePath, 0, CREATE_SUSPENDED);
m_hThread = pThread->m_hThread; //m_hThread是成员变量
pThread->m_bAutoDelete = FALSE;
pThre……
[/Quote]

会有资源泄漏吧
rcbblgy 2011-12-02
  • 打赏
  • 举报
回复
我也是这么认为的,但是有时它直接返回,有时就卡在那。
ouyh12345 2011-12-02
  • 打赏
  • 举报
回复
线程退出了,wait应该直接返回啊
酒红色的泪 2011-12-02
  • 打赏
  • 举报
回复
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);
rcbblgy 2011-12-02
  • 打赏
  • 举报
回复
线程函数的部分内容

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返回的时候。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧