在mfc中一个线程如何等待所有的线程结束?

二分掌柜的
人工智能领域优质创作者
2010-02-26 03:07:05
在mfc中一个线程如何等待所有的线程结束?



例如 我用for循环创建了100个线程A,然后我创建1个线程B,然后线程B需要等待所有的线程A执行完毕之

后,线程B才开始执行。

for (int i=0;i<100;i++)
{

CWinThread *pA=AfxBeginThread(函数A);

pA->ResumeThread();
}

CWinThread *pB=AfxBeginThread(函数B);
pB->ResumeThread();


类似这样代码。请指教
...全文
973 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
WizardK 2010-02-26
  • 打赏
  • 举报
回复
引用 12 楼 flyfish1986 的回复:
引用 10 楼 wizardk 的回复:
不用搞那么麻烦,用信号量嘛,创建时初值为0,最大值为100,每个A线程退出是对信号量RELEASE一次,在B线程中循环WAITFORSINGLEOBJECT做100次
这个方法还没有试过。


这样做直观,用信号量来计数,少消耗资源。
二分掌柜的 2010-02-26
  • 打赏
  • 举报
回复
引用 10 楼 wizardk 的回复:
不用搞那么麻烦,用信号量嘛,创建时初值为0,最大值为100,每个A线程退出是对信号量RELEASE一次,在B线程中循环WAITFORSINGLEOBJECT做100次

这个方法还没有试过。
smneo 2010-02-26
  • 打赏
  • 举报
回复
那等两个
while(1)
{
if ( WaitForMultipleObjects(50, handle1, TRUE, 0)==WAIT_OBJECT_0 && WaitForMultipleObjects(50, handle2, TRUE, 0)==WAIT_OBJECT_0 )
continue;

}
WizardK 2010-02-26
  • 打赏
  • 举报
回复
不用搞那么麻烦,用信号量嘛,创建时初值为0,最大值为100,每个A线程退出是对信号量RELEASE一次,在B线程中循环WAITFORSINGLEOBJECT做100次
二分掌柜的 2010-02-26
  • 打赏
  • 举报
回复
引用 2 楼 smneo 的回复:
查看MSDN
DWORD WaitForMultipleObjects(
  DWORD nCount,
  const HANDLE* lpHandles,
  BOOL bWaitAll,
  DWORD dwMilliseconds
);
函数用法,
让所有A现成HANDLE保存在一个数组中

HANDLE handle[100];
handle[...] = CThread.m_hThread;


B里面
WaitForMultipleObjects(100, handle, TRUE, INFINITE);
然后返回值为WAIT_OBJECT_0时为所有A执行完成..



WaitForMultipleObjects(100, handle, TRUE, INFINITE);中DWORD nCount, nCount最大值为64
music_0000 2010-02-26
  • 打赏
  • 举报
回复
先降线程的ID写到一个数组里,然后查这些ID是否都运行完毕即可。
smneo 2010-02-26
  • 打赏
  • 举报
回复
用二楼方法...哈哈.
二分掌柜的 2010-02-26
  • 打赏
  • 举报
回复
引用 4 楼 xsc2001 的回复:
线程A是你创建的,所以你可以定义一个数组结构保存各个线程的执行情况,结束以后各个线程就到这个结构中标明一下,说明自己已经执行完了。而线程B你也不用挂机它,也让它执行起来,不过线程一开始就进入检测状态,检查各个线程是否结束,如果没有结束则一直检测,如:
while(true)
{
    if(IsAllThreadFinished())//检查所有的A线程是否结束
        break;
    Sleep(100);
}
.........
.........
//线程B的其他语句

实现IsAllThreadFinished())有什么好的方法
zhou1xp 2010-02-26
  • 打赏
  • 举报
回复
如上,不过你的写法比较厉害
xsc2001 2010-02-26
  • 打赏
  • 举报
回复
线程A是你创建的,所以你可以定义一个数组结构保存各个线程的执行情况,结束以后各个线程就到这个结构中标明一下,说明自己已经执行完了。而线程B你也不用挂机它,也让它执行起来,不过线程一开始就进入检测状态,检查各个线程是否结束,如果没有结束则一直检测,如:
while(true)
{
if(IsAllThreadFinished())//检查所有的A线程是否结束
break;
Sleep(100);
}
.........
.........
//线程B的其他语句
二分掌柜的 2010-02-26
  • 打赏
  • 举报
回复
希望能详细一点,WaitForMultipleObjects 有限制。代码能够详细一些
smneo 2010-02-26
  • 打赏
  • 举报
回复
查看MSDN
DWORD WaitForMultipleObjects(
DWORD nCount,
const HANDLE* lpHandles,
BOOL bWaitAll,
DWORD dwMilliseconds
);
函数用法,
让所有A现成HANDLE保存在一个数组中

HANDLE handle[100];
handle[...] = CThread.m_hThread;


B里面
WaitForMultipleObjects(100, handle, TRUE, INFINITE);
然后返回值为WAIT_OBJECT_0时为所有A执行完成..
fishion 2010-02-26
  • 打赏
  • 举报
回复
用WaitForMultipleObjects,把你的线程用数组保存

15,473

社区成员

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

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