在win32 Application环境下想实现以下功能:创建一个线程不停的读并口(并口每20毫秒会有一个跳变),当读到有跳变时,重画屏幕(用DirectDraw实现,能在20毫秒之内完成),我的方法是在Winmain()进入消息循环之前用CreateThread()创建线程A,A不断的读并口,发现并口有跳变以后,发消息给窗口,窗口重画屏幕,而后返回A在读并口,如此循环。可是这样实现的话,由于要响应其他消息或其他的原因的关系,20毫秒只能不能完成重画屏幕的任务!有什么好的方法解决呢?
调试欢乐多
然后重新读数据。主程序定时检查标志位, 有则取数据刷新。这样界面与数据分开, 界面即使有时会慢,
也不会有数据丢失。
用rtdb(东临碣石)的方法,稍改动一下,每次只对最新的数据进行重画。
我每次都是只重画最新的部分,但是速度还是达不到要求。但是当我用定时器时,速度就能达到要求,问题是要求你必须用并口的跳变来控制runranrun(醉里挑灯看剑):优先级方法不行呀,画面会出现停顿现象。线程直接调用的话,我试试吧。如果有兴趣要源码的,请给出email
对你说得很感兴趣。
我不是很明白,是对并口信号响应的时间太长,还是响应后,重画的时间太长。
你提高进程优先级,可试一试设为REALTIME_PRIORITY_CLASS;并提高重画
线程的优先级,会怎么样?
呵呵
我说的做法并不是要加快重画的速度,而是要减少重画的次数阿
我做的是实时显示音量的,绘图比较简单。我用的是Mutex。采集获得的数据存于一个公共区域中,然后向绘图PostMessage采集完成。访问公共区域用Mutex同步。发送消息的时间间隔为40ms。采集用Sleep(40-采集时间)保证发送的频率。绘图简单的把缓冲的数据拷贝到自己的空间,就释放Mutex。绘图自行在自己的空间中处理绘图数据。因为我的绘图可以跟上,因此没设标志。你可以在缓冲中设标志,丢弃不需要的数据。
采集和绘图都有各自在缓冲中的索引。g_nPaintNum,g_nPortNum
采集和绘图通过索引访问缓冲中的数据,当绘图索引落后采集索引一定的值,比如4桢,则绘图索引g_nPaintNum+4,丢弃4桢数据。
我的方案,不知行不行。我也是初学者,请指正。
SendMessage可以向不是本线程建立的窗口发送消息
发送以后,发送的线程将会挂起,由窗口线程立即处理消息,然后返回,中间经过了大量的上下文切换,速度是慢了点,但是重画是最及时的
读并口:无限循环,写数据,读到跳变时,改变跳变标志量。
[email protected]
呵呵,假设A在100毫秒内在缓存里写了五次数据,而B重画一次就花了100毫秒,当B重画返回后,再对缓存中更新的五个数据一并进行重画,呵呵,只要重画一次,不需要重画5次阿。所以并不在乎你重画的速度有多快啊。而且这样做能够节省系统资源啊。
是的,人眼是反应不过来。但最后我的这个重画是要用来作为信号被采集的,所以必须保证这样的频率。
发件人:[email protected]
主题:code
[email protected]谢谢大家的帮助。拜谢!!!