关于主线程结束子线程的问题??

hzy694358 2011-03-18 06:25:16
好久没写多线程了,今天写了下,遇到一个郁闷的问题:
BOOL bClose = FALSE;//全局
MFC的程序中OnClose函数(关闭程序)
void CTestDlg::OnClose()
{
bClose = TRUE;
WaitForSingleObject(hMutex, INFINITE);//线程函数未结束时,结束程序会卡在这边
AfxMessageBox(L"Close thread");
ReleaseMutex(hMutex);
CloseHandle(hMutex);
hMutex = NULL;
CDialog::OnClose();
}
线程函数基本如下:
VOID ThreadMove(LPVOID param)
{
WaitForSingleObject(hMutex, INFINITE);
while(pRecordset->EndOfFile == VARIANT_FALSE)
{
if (bClose)
{
//pDlg->m_Info.SetWindowText(L"线程退出");
break;//
}
pRecordset->MoveNext();
}
pRecordset->Close();
pMyConnect->Close();
ReleaseMutex(hMutex);
return;

}
问题描述:
首先启动线程函数,线程函数未结束,此时关闭程序,调用了OnClose函数,但是会卡在WaitForSingleObject
函数这,不明白为什么?
...全文
171 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hzy694358 的回复:]

引用 9 楼 xianglitian 的回复:

你这个应用没必要用互斥量啊
直接WaitForSingleObject你的线程句柄不就得了
再说你在哪创建的互斥量呢?
你的线程函数能正常运行么
能执行到循环体里么

直接WaitForSingleObject你的线程句柄 要等线程函数执行完毕才可以结束
我想让线程函数退出循环正常结束的
问题已经查明:
是在线程函数里直接操……
[/Quote]
呵呵
解决就好
hzy694358 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]

你这个应用没必要用互斥量啊
直接WaitForSingleObject你的线程句柄不就得了
再说你在哪创建的互斥量呢?
你的线程函数能正常运行么
能执行到循环体里么
[/Quote]
直接WaitForSingleObject你的线程句柄 要等线程函数执行完毕才可以结束
我想让线程函数退出循环正常结束的
问题已经查明:
是在线程函数里直接操作界面导致的,
直接换成PostMessage 操作消息函数就可以了
哎,半年多一直处理服务器没写MFC,很多都生疏了……
………………
……

向立天 2011-03-19
  • 打赏
  • 举报
回复
你这个应用没必要用互斥量啊
直接WaitForSingleObject你的线程句柄不就得了
再说你在哪创建的互斥量呢?
你的线程函数能正常运行么
能执行到循环体里么
hzy694358 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dyzhen 的回复:]

线程里面加断点调试看看,估计是堵在WaitForSingleObject(hMutex, INFINITE);了
[/Quote]
我题目不是说清楚了吗
码丁农 2011-03-19
  • 打赏
  • 举报
回复
线程里面加断点调试看看,估计是堵在WaitForSingleObject(hMutex, INFINITE);了
hzy694358 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 heksn 的回复:]

死锁???
[/Quote]
不知啊,执行OnClose()里的
WaitForSingleObject(hMutex, INFINITE);
这时阻塞了,不是应该继续执行线程函数的吗,而这时bClose为ture了
if (bClose)
{
break;//
}
这就会让线程退出了吧,可是却一直卡住了,这是哪边有问题?
  • 打赏
  • 举报
回复
死锁???
码丁农 2011-03-18
  • 打赏
  • 举报
回复
if (bClose)
{
//pDlg->m_Info.SetWindowText(L"线程退出");
break;//
}

这会造成双方都在永远等待的。。
  • 打赏
  • 举报
回复
帮顶!
Dreadnought 2011-03-18
  • 打赏
  • 举报
回复
你点击OnClose时,线程可能还没有结束ReleaseMutex得不到执行,所以卡在那里了
dong364 2011-03-18
  • 打赏
  • 举报
回复
线程函数未结束时还没有ReleaseMutex(hMutex);
所以在OnClose()那
WaitForSingleObject(hMutex, INFINITE); 永久等待

15,471

社区成员

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

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