在下写了一段代码,想通过一个线程中的WaitForMultipleObjects函数来响应某个事件,因为很简单,所以绑定函数的只有一个HANDLE句柄,但是在实际测试时发现,主线程在投递消息时(SetEvent),如果毫不暂停的连续投递,则很容易造成WaitForMultipleObjects函数没有准确的响应每一个消息,百思不得其解……WaitForMultipleObjects函数承受能力应该很强才对,到底是我哪里出错了?求各位达人指教。在主线程创建事件句柄,然后启动线程和计时器,通过主线程的计时器每一秒向目标线程投递多个事件消息: stc_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
m_Handle = CreateThread(NULL, NULL, TestProc, this, 0, NULL); SetTimer(1201, 1 * 1000, 0);
计时器所做的工作,每一轮都统计上一次投递和接收到的数量,然后进行下一轮的投递:void CtestDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 1201:
{
if (m_Send != m_Receive)
{
sprintf_s(m_Log, sizeof(m_Log), "event send-%I64u got-%I64u failed-%I64u", m_Send, m_Receive, m_Failed);
Msg(m_Log);
} for (int i = 0; i < 10; ++ i)
{
if (TRUE == SetEvent(stc_hEvent))
{
++ m_Send;
}
}
}
break;
}
}
工作线程的代码:DWORD __stdcall CtestDlg::TestProc(LPVOID lpParam)
{
CtestDlg *InP = reinterpret_cast<CtestDlg*>(lpParam); while (true == InP->m_IsRuning)
{
int nIndex = ::WaitForMultipleObjects(1, &stc_hEvent, FALSE, INFINITE); switch (nIndex)
{
case WAIT_TIMEOUT:
{ }
break;
case WAIT_FAILED:
{
++ InP->m_Failed;
}
break;
case WAIT_OBJECT_0:
{
++ InP->m_Receive;
}
break;
default:
{ }
}
} return 1;
}
很简单的测试代码,可结果就总是不正确,只有把计时器中每轮SetEvent的数量减少到2以下,才不会造成数量不对的问题。但是我通过测试又发现,如果每轮SetEvent的次数只有1~2,但是把计时器的频率增加到每毫秒一次(SetTimer(1201, 1 * 1000, 0);),数目也不会有问题;或者反过来,在每次SetEvent的时候加一个Sleep(1)也可以……请问这到底是为什么呢?另外,在很多关于WaitForMultipleObjects的帖子中我都看到了代码中有“ProcessHanlde()”这个函数,可百度和Google都找不到,请问这个函数是从哪个头文件或库中导入的?……

解决方案 »

  1.   

    WM_TIMER消息优先级不高, 也可能会合并,丢弃,这个也可能是一个原因
      

  2.   


    多谢回复
    不过我的问题似乎和这个关系不大。因为我用的变量m_Send就是用来统计发送数的,从它的结果来看,不管设定为每轮发送多少个,在没有Sleep的情况下,每次都发送了正确的数量,反而是工作线程那边的m_Receive数字总是莫名的少了。比如我设定的计时器每秒执行一次,每一次连续发送10个,那么m_Send的数字就总是10、10的增加,而m_Receive则总是2、3的增加,看起来是从来都不能完整的接收到发送的数字。event send-10 got-2 failed-0
    event send-20 got-4 failed-0
    event send-30 got-6 failed-0
    event send-40 got-8 failed-0
    event send-50 got-10 failed-0
    event send-60 got-12 failed-0
    event send-70 got-14 failed-0
    event send-80 got-16 failed-0
    event send-90 got-18 failed-0
      

  3.   

    event不是用来发消息的,是用来设定一个可以继续的条件
    要发消息用pipe
      

  4.   

    WaitForMultipleObjects等待事件之后,要ResetEvent后,再SetEvent。
    而你毫不暂停的连续投递, WaitForMultipleObjects响应不准确,这要去问微软
      

  5.   

    在很多关于WaitForMultipleObjects的帖子中我都看到了代码中有“ProcessHanlde()”这个函数,可百度和Google都找不到,请问这个函数是从哪个头文件或库中导入的?……
      我也很想知道啊?你知道了吗?你的问题解决了吗?