我在主框架函数里开了一个数据采集线程,线程结束的时候给一个标志变量赋值pDataAcquisition->bDataFinished = TRUE;
然后将View刷新一下:pTestView->Invalidate();在View.cpp里的OnDraw函数里,判断该标志pDataAcquisition->bDataFinished ,如果为真则向屏幕输出几行字:
pDC->TextOut(10,10,"左脚-右脚");
str.Format(_T("%0.1f"),pFrame->pDataAcquisition.ADCData);
pDC->TextOut(10,10+j*10,str);运行的时候屏幕上有字,但是问题是总是不停的闪烁,不知道为什么?按理说在OnDraw里显示只有在需要重绘的时候才会闪烁呀,但是我这里没有别的函数调用OnDraw,怎么回事呢?请达人指点。注:pDataAcquisition是一个类的实例,在该类中,由一个变量ADCData;pFrame是主框架的实例,

解决方案 »

  1.   

    闪烁就是由于刷新频率高引起的,用双缓存可以解决,双缓存CSDN上帖子很多
      

  2.   

    断点指定到pTestView->Invalidate(); 看看是不是有别的代码调用这里了。
      

  3.   

    我在OnDraw函数的其他部分还有输出文字到屏幕上,那些不闪烁呀,怎么这个就闪烁呢,会不会跟线程有关呢?
      

  4.   

    数据采集线程的最后几行代码是这样的
      pDataAcquisition->bDataFinished = TRUE;
    pDataAcquisition->bDataAcquisition = FALSE;
    AfxMessageBox(_T("数据采集结束!"));
    pDataAcquisition->pTestView->Invalidate();
    return 0;我调试运行到pDataAcquisition->pTestView->Invalidate();
    这里,在运行就是不停的闪烁了,也就是说程序一直停在这里了?但是不用这句代码又没法通知View重绘,请问达人该如何解决呢?
      

  5.   

    画的代码放在OnPaint中吧,view中搞个函数判断后invalidate().
      

  6.   

    但是如果放到OnPaint中绘图,那么就不能自动响应了,最主要的就是不能在采集线程结束后自动绘图了
      

  7.   

    试试重载WM_ERASEBKGND,添加return FALSE.
      

  8.   

    我刚才用TRACE语句跟踪了一下,发现即使是去掉Invalidate语句,当窗口改变的时候,屏幕也会不停的闪烁。就是因为这次的绘图是由线程中的那个变量控制的,才导致的屏幕不停的闪烁,好像是一直退不出这个线程一样。我在OnDraw里又做了一个实验,就是不用该变量控制绘图的话,屏幕上的输出是稳定的,
    请问达人,这个时候如果是因为线程没有退出的话,该怎么解决呢?
      

  9.   

    窗口改变就会发送WM_PAINT消息嘛。Invalidate也是发送WM_PAINT的。在OnDraw中TRACE一条消息,看看是不是不停的走。
      

  10.   

    绘制完成后 pDataAcquisition->bDataFinished = False; 
      

  11.   

    绘制完成后 pDataAcquisition->bDataFinished = False; 
      

  12.   

    在线程里面画,然后invalidate就可以了。
    如果在ondraw 里面画,效果是一样的