WaitForMultipleObjects为啥过一阵子就等不到了

thundersung 2014-07-29 10:44:30
这是线程死循环里的

switch(WaitForMultipleObjects(3, m_hEventArray, FALSE, INFINITE)) {
case 0:。。。
case 1:。。。
case 2:
{
Function();
break;
}
default:
{
AfxMessageBox(TEXT("接收有问题!"));
break;
}

这是Function里的
。。。
ResetEvent(m_hEventArray[2]);
。。。

另外一个线程周期SetEvent(m_hEventArray[2]);
但是WaitForMultipleObjects等着等着就等不到m_hEventArray[2]了,打印log就是SetEvent虽然不停得调用,但Wait函数始终不能打断点在case 2上。

...全文
175 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
thundersung 2014-07-29
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
可是你的代码显示的是 Reset 啊!!
Function里面的吗,因为CreateEvent的视乎设定了手动清除信号状态,所以要在Wait到后Reset的啊。
Saleayas 2014-07-29
  • 打赏
  • 举报
回复
可是你的代码显示的是 Reset 啊!!
brk1985 2014-07-29
  • 打赏
  • 举报
回复
引用 1 楼 dream238 的回复:

case WAIT_OBJECT_0:
case WAIT_OBJECT_0 + 1:
case WAIT_OBJECT_0 + 2:
{
        Function();
        break;
}
default:
{
        AfxMessageBox(TEXT("接收有问题!"));
        break;
}
case的条件不对,返回值可以参考MSDN的文档:http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx
这个不是原因吧?很奇怪,看msdn是这么说。。。 但是CSerialPort这个类里面的函数就是楼主这么用的。。。 DWORD Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE); switch (Event) { case 0: { // Shutdown event. This is event zero so it will be // the higest priority and be serviced first. port->m_bThreadAlive = FALSE; // Kill this thread. break is not needed, but makes me feel better. AfxEndThread(100); break; } case 1: // read event { GetCommMask(port->m_hComm, &CommEvent); if (CommEvent & EV_RXCHAR) //接收到字符,并置于输入缓冲区中 ReceiveChar(port, comstat); if (CommEvent & EV_CTS) //CTS信号状态发生变化 ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_CTS_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_RXFLAG) //接收到事件字符,并置于输入缓冲区中 ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RXFLAG_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_BREAK) //输入中发生中断 ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_BREAK_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_ERR) //发生线路状态错误,线路状态错误包括CE_FRAME,CE_OVERRUN和CE_RXPARITY ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_ERR_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); if (CommEvent & EV_RING) //检测到振铃指示 ::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RING_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr); break; } case 2: // write event { // Write character event from port WriteChar(port); break; } } // end switch
ArcRain 2014-07-29
  • 打赏
  • 举报
回复

case WAIT_OBJECT_0:
case WAIT_OBJECT_0 + 1:
case WAIT_OBJECT_0 + 2:
{
        Function();
        break;
}
default:
{
        AfxMessageBox(TEXT("接收有问题!"));
        break;
}
case的条件不对,返回值可以参考MSDN的文档:http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx
kuankuan_qiao 2014-07-29
  • 打赏
  • 举报
回复
堵住了吧 哈哈
Eleven 2014-07-29
  • 打赏
  • 举报
回复
WaitForMultipleObjects的返回值 - WAIT_OBJECT_0才是索引,前提是WaitForMultipleObjects函数返回成功了,而不是返回WAIT_FAILED/WAIT_TIMEOUT之类的错误
昨夜无风 2014-07-29
  • 打赏
  • 举报
回复
case 0:break; case 1:break;
thundersung 2014-07-29
  • 打赏
  • 举报
回复
另外,Wait改成ForSingleObject的话,就能够等到了。啥情况?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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