我的程序要解决的问题是:用按钮消息事件来启动一个数据采集的线程,就是从数采卡获得数据,数据采集的线程是每个2ms获得一个数据,当有数据获得时,启动画曲线的线程在视图上画一个点。也就是说采到一个数据,启动画曲线线程画点。
当我如此做时,却出现内存资源消耗太多,我怀疑是否是要在画完一个点后,要结束画曲线线程?如何解决这个问题?谢谢!

解决方案 »

  1.   

    是否释放了GDI对象!!!
    CDC *pDC = pWnd->GetDC();
    ASSERT_VALID(pDC);
    .......
    pWnd->Release(pDC);没有清除GDI对象,看是否没有调用了GID对象的DeleteObject()来清除!!!
    我以前也遇到过同样的问题!!!
      

  2.   

    你应当尽量把数据获得和处理放在一起做,不同的线程都要访问的变量最好加上volatile关键词,这样数据就不会存取不同了
    意思就是说你的后台的线程只管判断有没有数据到来,有的话PostMessage
    然后在消息处理里面去绘图,这样可能比较好些,我就是这么做的
      

  3.   

    非常典型的没有优化算法的现象。"当有数据获得时,启动画曲线的线程在视图上画一个点"。问题出在这一句。你不应该每启动一次线程就创一个GDI对象,线程结束后就释放GDI对象。正确做法:
    线程不结束,每画一个点后如果没有消息在排队就挂起(suspend)自已。线程的GDI对象也不用释放了。每采集到数据就发自定消息,响应自定义消息的函数负责唤醒线程。另外,问一下你采集信号的过程是否占用100%CPU ?
      

  4.   

    采集信号的过程不用占用100%的cpu
    有没有相应的代码?
      

  5.   

    我的想法是这样的,不用线程画曲线.
    线程用来收集数据.收到数据后可以用sendmessage()或PostMessage(),在这个消息处理函数中画线.
    开两个线程必须考虑到同步.
      

  6.   

    应该主线程画线、后台线程采集数据。两者通过一个共享缓冲区做数据通讯。后台采集数据放入缓冲区后给前台发一消息,由前台的消息处理函数调用Invalidate函数。再由OnPaint消息处理函数根据共享数据区的数据画线。这样可以保证在其它窗口冲掉你的窗口的曲线后,程序还可以正确的重画。另外因WM_PAINT消息的优先级较低,如果重画教费时的话,不会影响程序对用户操作的响应。如果你的程序需要每2ms采集一个数据的话,后台程序都不需要向前台发消息,可在前台程序中设一个定时器,几十毫秒即可,在WM_TIMER的处理函数中调用Invalidate即可。再快也没用,因人眼的反应没有那么快。