在win32 Application环境下想实现以下功能:创建一个线程不停的读并口(并口每20毫秒会有一个跳变),当读到有跳变时,重画屏幕(用DirectDraw实现,能在20毫秒之内完成),我的方法是在Winmain()进入消息循环之前用CreateThread()创建线程A,A不断的读并口,发现并口有跳变以后,发消息给窗口,窗口重画屏幕,而后返回A在读并口,如此循环。可是这样实现的话,由于要响应其他消息或其他的原因的关系,20毫秒只能不能完成重画屏幕的任务!有什么好的方法解决呢?
               

解决方案 »

  1.   

    用PostMessage行吗,它是立即返回的吧,不需要等重画消息处理完毕吧
      

  2.   

    创建线程A读到数据后放到一个DATA LIST中。并设一个标志,
    然后重新读数据。主程序定时检查标志位, 有则取数据刷新。这样界面与数据分开, 界面即使有时会慢,
    也不会有数据丢失。
      

  3.   

    logdzc(永远的步行者):是会立即返回,但重画还是会比较慢。rtdb(东临碣石) :但是现在主要的问题不是数据丢失,而是速度太慢。现在主要的问题是如何能保证在20毫秒内重画完成,不一定要采用我这种方案,其他方案也可以。
      

  4.   

    既然并不关心数据丢失的问题,
    用rtdb(东临碣石)的方法,稍改动一下,每次只对最新的数据进行重画。
      

  5.   

    logdzc(永远的步行者):
    我每次都是只重画最新的部分,但是速度还是达不到要求。但是当我用定时器时,速度就能达到要求,问题是要求你必须用并口的跳变来控制runranrun(醉里挑灯看剑):优先级方法不行呀,画面会出现停顿现象。线程直接调用的话,我试试吧。如果有兴趣要源码的,请给出email
      

  6.   

    定时器和多线程在系统地实现上是不一样的,不知道你的读串口线程的优先级是多少?你是使用什么方法来控制重画的,是简单的发送一个消息吗,而没有让读串口线程休眠吗?如果这样的话,你的两个线程分时共享cpu,可能会出现你的问题。
      

  7.   

    我认为是不必要的担心.我现在做的项目,客户端是一连串发数据,中间不停,服务器端接收,解码,处理,显示,好像完全可以胜任,更别说你的还有20ms,而且是串口.当然我的配置是p4 2.0GA,384MB.我也担心有事数据处理不过来,当我是实时软件,故处理不过来我就抛弃不要,只处理最新的.
      

  8.   

    [email protected]
    对你说得很感兴趣。
    我不是很明白,是对并口信号响应的时间太长,还是响应后,重画的时间太长。
    你提高进程优先级,可试一试设为REALTIME_PRIORITY_CLASS;并提高重画
    线程的优先级,会怎么样?
      

  9.   

    [email protected]
    呵呵
    我说的做法并不是要加快重画的速度,而是要减少重画的次数阿
      

  10.   

    需要看看你的采集要花多少时间?如果采集要20ms,那怎么也不能完成啊。只有丢弃数据才行。
    我做的是实时显示音量的,绘图比较简单。我用的是Mutex。采集获得的数据存于一个公共区域中,然后向绘图PostMessage采集完成。访问公共区域用Mutex同步。发送消息的时间间隔为40ms。采集用Sleep(40-采集时间)保证发送的频率。绘图简单的把缓冲的数据拷贝到自己的空间,就释放Mutex。绘图自行在自己的空间中处理绘图数据。因为我的绘图可以跟上,因此没设标志。你可以在缓冲中设标志,丢弃不需要的数据。
    采集和绘图都有各自在缓冲中的索引。g_nPaintNum,g_nPortNum
    采集和绘图通过索引访问缓冲中的数据,当绘图索引落后采集索引一定的值,比如4桢,则绘图索引g_nPaintNum+4,丢弃4桢数据。
    我的方案,不知行不行。我也是初学者,请指正。
      

  11.   

    假如搂主不在乎数据丢失:
    SendMessage可以向不是本线程建立的窗口发送消息
    发送以后,发送的线程将会挂起,由窗口线程立即处理消息,然后返回,中间经过了大量的上下文切换,速度是慢了点,但是重画是最及时的
      

  12.   

    显示:用定时器timeSetEvent。在回调函数入口检查,当跳变标志量(全局)改变时,重画。将标志量改回。
    读并口:无限循环,写数据,读到跳变时,改变跳变标志量。
      

  13.   

    logdzc(永远的步行者) , allenhai1980(心蓝世界) :源码已发出,请查收!小弟是初学,代码写得不是很规范。zzland(蓝迪),allenhai1980(心蓝世界) :我是将优先级设为实时,但是读并口的程序并未休眠。我试一试休眠吧。wangbab(bab):我试一试吧!小弟是初学者,多谢各位大哥指教!(多线程刚看了两三天)。
      

  14.   

    我帮你看看!
    [email protected]
      

  15.   

    呵呵,可能邮箱有问题,我没有收到哦我的意思是,用一个线程A读并口,然后把数据写入缓存,另一个线程B执行重画,每一次重画完毕后,就再次检查缓存,并对所有更新的数据进行重画。
    呵呵,假设A在100毫秒内在缓存里写了五次数据,而B重画一次就花了100毫秒,当B重画返回后,再对缓存中更新的五个数据一并进行重画,呵呵,只要重画一次,不需要重画5次阿。所以并不在乎你重画的速度有多快啊。而且这样做能够节省系统资源啊。
      

  16.   

    你再去看看吧,hotmail就是有一些慢谁技术好谁就是大哥,我当然是小弟了!另:如何在DirectDraw全屏幕模式下调试,我每次都不能从全屏模式中跳出来,不知道为什么?有没有设么特殊的调试方法?
      

  17.   

    调试问题已解决。expedition(浆糊):我就是用的增量重画!
      

  18.   

    也许你重画的频率没有必要那么高,认得眼睛是响应不了这么高的频率的。你可以减低对屏幕画面的重画频率(例如24次/妙),从而空出CPU和系统资源,确保程序对端口的响应和处理。
      

  19.   

    expedition(浆糊) :
    是的,人眼是反应不过来。但最后我的这个重画是要用来作为信号被采集的,所以必须保证这样的频率。
      

  20.   

    logdzc(永远的步行者):我又发了一次,看看有没有。不会当垃圾邮件删除了吧!
    发件人:[email protected]
    主题:code
      

  21.   

    总算是解决了这个问题,但可惜的是不是用多线程。如果大家还有什么好的解决方法可以和我联系。
    [email protected]谢谢大家的帮助。拜谢!!!