我要做个实时监控东西,通过定时器控制,每20ms调用一次更新函数,然后调用this->Invalidate(false);通过OnDraw刷新页面;
但是画面无法正常刷新,而是卡住了,不知怎么回事?
部分代码:
case  ID_TIMER_ONLINE:
if (bPipeOpen)
{
dealDataFromPipe();   //此函数更新需要显示的内容;
this->Invalidate(TRUE);
}
break;
十分感谢!!!

解决方案 »

  1.   

    20ms周期太短了,操作系统响应不过来
    另外,即使操作系统可以,监控的人也来不及看啊
    因此,需要LZ重新设计界面显示策略
      

  2.   

    先设置断点确认一下这段代码会不会执行到。
    另外,用调试方式运行程序,不设置断点,程序卡住时用调试功能暂停程序,根据调用堆栈的信息找出正在执行哪里的代码。
    实时监控的程序最好不要用Invalidate刷新界面,可以用GetDC然后直接绘制界面,另外最好能判断出需要更新的区域,尽量用局部更新的方式。
      

  3.   

    Windows中WM_TIMER的消息是优先级最低的消息,只有在其他消息都处理完得情况下才会处理它,而且他的精度一般在55ms左右,建议不要使用这机制。
    如果需要20ms的精度,建议使用CreateWaitableTimer()效果会更好
      

  4.   

    是不是你的dealDataFromPipe(); 是一个比较耗时的函数呀,如果你的这个函数超过20ms秒呢,而你的OnTimer可是每20秒处理一次呀,这样OnTimer的处理消息会堆积的越来越多,所以肯定会出现反应不过来的情况。一般情况下这种刷新最好是自己写一个线程函数,在线程函数里定期刷新界面。