我要在一个while循环里面等消息(其实只是等一个变量改变数值,我可将这个做成一个自定义消息发出来),怎么才能够让这个while自动停下来等待,只是隔几秒自动检测一次看数值有没有变(有变执行,没变化继续等)或者有消息到达就继续执行while循环。我用WaitForSingleObject和MsgWaitForMultipleObjects试了试,就是不知道参数HANDLE hHandle,该怎么设。

解决方案 »

  1.   

    while(1)
    {
    if(...)
    {} //得到消息
    else
    {
    Sleep(0);  //  线程让出cpu
    }
    }
    建议用多线程,在一个单独的线程中检测消息。
      

  2.   

    PeekMessage(&Msg,NULL,0,0,PM_NOREMOVE);
    while(GetMessage(&Msg,NULL,0,0)>0)
    {
    ...
    }
      

  3.   

    你不要做自定义消息,用个事件就好了
    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    ..WaitForSingleObject(hEvent, INFINITE);然后在变量改变后调用:
    SetEvent(hEvent);
    就可以了
      

  4.   

    同意 ymbymb(毛病大哥),消息会带来性能损失
      

  5.   

    开个线程,然后在里面用事件作
    HANDLE myevent=CreateEvent(NULL, TRUE, FALSE, _T("event"));UINT MyworkThread(LPVOID lparam)
    {
       WaitForSingleObject(myevent,INFINITE);
       //do something u want}在适当位置用AfxBeginThread(MywrokThread,(Void *)NULL);开启这个线程然后再变量改变后使用语句:
    SetEvent(hEvent);
    即可
      

  6.   

    while(bWait)
    {
    }
    就可以了,在其他线程里设置bWait让它停下来
      

  7.   

    TO ymbymb(毛病大哥)
    我做了个最简单的例子做实验,可是没有试通,请指点一下。
    我定义了个全局的HANDLE hEvent;在OnInitDialog()里面hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);  flag = 1.
    然后再button里面做while(flag){WaitForSingleObject(hEvent, INFINITE);}. 
    接着在LButtonDown事件里面设flag = 0; SetEvent(hEvent);
    可是程序没有任何反映,调试了一下。程序就停在WaitForSingleObject(hEvent, INFINITE);一直不动了。
      

  8.   

    while(flag){WaitForSingleObject(hEvent, INFINITE);}. 
    把while去掉
      

  9.   

    while(flag)
    {
      DoEvents();
    }void CMyView::OnLButtonDown(..)
    {
       flag = 0;
    }
    void DoEvents()
    {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return;
    }