HANDLE  g_signal1;
HANDLE  g_signal2;
UINT MyThread(LPVOID param)
{
DWORD dwRet =0;
int y;
DWORD nCount =2;
HANDLE handle[2] ={g_signal2,g_signal1};
enum CEvent{SIGNAL2=0,SIGNAL1};
CEvent event;
while (1) 
{
dwRet=::WaitForMultipleObjects(nCount,handle,false,INFINITE);

switch(dwRet)

        {


case WAIT_OBJECT_0:
TRACE("SIGNAL2\n");
break;
case WAIT_OBJECT_0+1:
TRACE("        SIGNAL1\n");
break;
default:
break;
} }

return 1;
}UINT MyThread1(LPVOID param)
{

for(int i=0;i<50;i++)
{
::SetEvent(g_signal1);

for(int j=0;j<5;j++)
{
::SetEvent(g_signal2);

}
}

return 1;
}CWwView::CWwView()
{
// TODO: add construction code heren
HWND hWnd=GetSafeHwnd(); 
g_signal1 = ::CreateEvent(NULL, FALSE, FALSE, "signal1");
g_signal2 = ::CreateEvent(NULL, FALSE, FALSE, "signal2");
AfxBeginThread(MyThread,hWnd,THREAD_PRIORITY_NORMAL); 
AfxBeginThread(MyThread1,hWnd,THREAD_PRIORITY_NORMAL); 

::OpenEvent(EVENT_ALL_ACCESS,false, "signal1");
::OpenEvent(EVENT_ALL_ACCESS,false, "signal2");}照理来说,结果应该输出一行SIGNAL2,接着输出5行SIGNAL1,这样连续重复50次。
但是,由于事件产生太快,WaitForMultipleObjects来不及处理这么多事件,导致大量丢数据,请问高手如何处理,急!!

解决方案 »

  1.   

    是的,在循环里SETEVENT太快了。如果你只是累计,而不需要SET一下RUN一下,可以考虑用信号量,否则可以尝试一下SLEEP(0),并将MyThread的优先级调高。
      

  2.   

    WaitForMultipleObjects(nCount,handle,false,INFINITE); 
    参数没设对吧,
      

  3.   

    楼主对程序的理解有误,按照你的程序只会出现一次SIGNAL1而已,不会出现你要的结果,你自己仔细读下程序,这是你自己写的吗
      

  4.   

    我这个程序只是测试WaitForMultipleObjects能不能把事件全都接收到。
    我用RTX(Real—-time Extention,能提供了高速、准确响应时间的实时子系统)接收硬件时钟板两个脉冲信号,分别是10ms,31.25ms。然后RTX接收中断响应后,发事件给我的界面程序(VC6.0实现)。我发现用WaitForMultipleObjects不能把所有事件都接收到。因为我分别对RTX接收中断响应及界面程序接收事件进行打印,发现RTX对中断都进行了响应,而界面不能完全接收所有的事件。所以希望大家帮我出出主意,我到底该怎么办,才能把事件接收齐了。