针对多CEvent对象,WaitForMultipleObjects一直返回0,而不是1.......

RocketttttSky2018 2021-05-02 04:38:33


针对多CEvent对象,WaitForMultipleObjects一直返回0,而不是1.......

试验了好多次,系统是2016server2 + vs2017. 奇怪了.............

main()
{
// TODO: 在此添加控件通知处理程序代码
m_hEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);

SetEvent(m_hEvent[0]);
SetEvent(m_hEvent[1]);

CreateThread(NULL, 0, MyThreadProcWaitAll, this, 0, NULL);

}

DWORD WINAPI MyThreadProcWaitAll(LPVOID lpParam)
{
while (TRUE)
{ //每次等500毫秒
int nIndex = WaitForMultipleObjects(2, m_hEvent, TRUE, 5000);

spdlog::info("等待两个事件,nIndex = {} ", nIndex);

if (nIndex == WAIT_OBJECT_0 + 1)
{
spdlog::info("第二个事件发生, nIndex = {} ", nIndex);
break;
}
else if (nIndex == WAIT_OBJECT_0) //第一个事件发生
{
spdlog::info("第一个事件 , nIndex = {} ", nIndex);
break;
}
else if (nIndex == WAIT_TIMEOUT) //超时500毫秒
{
break;
}
}
spdlog::info("线程结束....");
return 0;
}
...全文
2764 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RocketttttSky2018 2021-05-12
  • 打赏
  • 举报
回复
引用 4 楼 Eleven 的回复:
你的主线程main函数的代码怎么写的?CreateThread调用完后面就没有了吗?
CreateThread后面做了设置,子线程是不关闭的。目的是让子线程跑一个死循环,函数内等待event通知,通知前都是阻塞的。一旦来了通知就运行子线程后面代码。 我是新手,办法很笨。 WaitForMultipleObjects这个不行,我就用了WaitForSingleObject函数。做了8个子线程,每个线程1个event,然后8个WaitForSingleObject写到一个循环中,持续不断的“监听”。 请老师指点。 c++ std里面有condition——variable,应该也可以达到这个目的,但是不太会用,在学习中。暂且用event事件对象来达到目的吧。谢谢版主
RocketttttSky2018 2021-05-11
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
WaitForMultipleObjects 的 第三个参数设置了 TRUE了, 没有出错就是全都由信号了
是的,老师。 就是参数是true,就是其他线程全部给出信号,才可以进行第二步。 第一步由几个线程同时工作。工作完成纷纷给出一个完成的信号。
hyqhero 2021-05-06
  • 打赏
  • 举报
回复
“ //每次等500毫秒 int nIndex = WaitForMultipleObjects(2, m_hEvent, TRUE, 5000); ” ------明明是5s,~~~ 另外: SetEvent应该放到CreateThread之后吧?
Eleven 2021-05-06
  • 打赏
  • 举报
回复
你的主线程main函数的代码怎么写的?CreateThread调用完后面就没有了吗?
zgl7903 2021-05-05
  • 打赏
  • 举报
回复
WaitForMultipleObjects 的 第三个参数设置了 TRUE了, 没有出错就是全都由信号了
RocketttttSky2018 2021-05-02
  • 打赏
  • 举报
回复
多个内核对象被触发时,WaitForMultipleObjects选择其中序号最小的返回。 而WaitForMultipleObjects它只会改变使它返回的那个内核对象的状态。 这儿又会产生一个问题,如果序号最小的那个对象频繁被触发,那么序号比它大的内核对象将的不到被出理的机会。  为了解决这一问题,可以采用双WaitForMultipleObjects检测机制来实现。 ———————————————— 版权声明:本文为CSDN博主「四极管」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/yangxingbo0311/article/details/7323762
RocketttttSky2018 2021-05-02
  • 打赏
  • 举报
回复
msdn MSDN说这个 Return code/value WAIT_OBJECT_0 to (WAIT_OBJECT_0 + nCount– 1) Description If bWaitAll is TRUE, a return value in this range indicates that the state of all specified objects is signaled. If bWaitAll is FALSE, the return value minus WAIT_OBJECT_0 indicates the lpHandles array index of the object that satisfied the wait. If more than one object became signaled during the call, this is the array index of the signaled object with the smallest index value of all the signaled objects. true的时候,现在看return value是0 ; false的时候,也是0,返回最小的也是0

15,473

社区成员

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

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