hur.cn - 华软网

 热门搜索

如何在主线程中等待子线程执行完毕?

  作者:未知    来源:网络    更新时间:2009/2/25
我想在主线程中等待子线程执行完毕后再进行其他操作,可是我发现无论用互斥对象还是事件对象,都会发生线程死锁,还请各位高手看看该如何解决,谢谢。
---华软 网友回答---
怎么可能,哪个线程死锁?
---华软网友回复---
死锁是你自己没处理好,该释放权限的时候没释放
---华软网友回复---
如下是用Critical Section来进行操作的程序片段,依然会在子线程中间某处死锁,还请看看问题在哪里,谢谢。

CRITICAL_SECTION g_cs;//全局变量
void CTestDlg::OnTest()
{//主线程
......//省去参数赋值过程
CWinThread* pThread=AfxBeginThread(ItemAdded,&m_Param,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
pThread->ResumeThread();
InitializeCriticalSection(&g_cs);
Sleep(1000);//子线程获取执行机会
EnterCriticalSection(&g_cs);//申请Critical Section所有权
LeaveCriticalSection(&g_cs);
DeleteCriticalSection(&g_cs);
........
}
UINT ItemAdded(LPVOID pParam)
{//子线程
EnterCriticalSection(&g_cs);
.......
LeaveCriticalSection(&g_cs);
}
---华软网友回复---
子线程正常退出时设置一个event,主线程等待就是了。

---华软网友回复---
这样的话,用WaitForSingnalObject吧
---华软网友回复---
WaitForSingnalObject( 线程句柄,INFINITE );只有线程退出后才会返回
---华软网友回复---
这种情况建议用CEvent比较好。

---华软网友回复---
我现在发现问题不出在使用哪种方式上,而是我把主窗口指针传给了子线程,在子线程中会操作主窗口,此时由于
主线程一直处于等待状态,而子线程似乎也必须等待主线程结束才能操作主窗口,所以就进入了死锁。
真是头痛,不知道有没有人遇到过这种情况。
---华软网友回复---
WaitForSingnalObject( 线程句柄,INFINITE );只有线程退出后才会返回,不过界面会卡
---华软网友回复---
引用 8 楼 boybay 的回复:
我现在发现问题不出在使用哪种方式上,而是我把主窗口指针传给了子线程,在子线程中会操作主窗口,此时由于
主线程一直处于等待状态,而子线程似乎也必须等待主线程结束才能操作主窗口,所以就进入了死锁。
真是头痛,不知道有没有人遇到过这种情况。

遇到同样的问题,头痛。。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。