Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2342337
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:01:37

一般断续都与显示有关, 与定时关系不大。
由于 GDI 的显示处理速度很慢, 也有可能是因为显示的原因, 有时没忙的过来显示, 可以用 Repaint 方法强制 Label 刷新显示。
如果显示闪烁, 需要设置容器的 DoubleBuffered 属性为 true, 例如 Panel1->DoubleBuffered = true;

你的方法我没用过。

用 Timer 控件可以在 Windows NT/2000/XP/2003 等 NT 内核的操作系统里面达到 1 毫秒的精度,
但是在 Win9x 里面精度是 55 毫秒 (定时必须为 55 的整数倍, 如果不是就找个最接近的 55n 的值), 不能达到你的要求。
Timer 控件非常节省 CPU 资源。

精度最高的办法(当然要牺牲CPU的效率,提高了精度,降低了CPU的效率):
一般用查询计数器的方法可能会好一些,Windows有一个精度为1毫秒的计数器,循环计数:
timeBeginPeriod(1); //程序的最开始(主窗口的构造函数)要设置计数器的精度为 1 毫秒
timeEndPeriod(1); //程序的结束(主窗口的析构函数)要恢复计数器
iCounter = timeGetTime(); //读出当前计数器的值
开始保存计数器值,然后不停查询计数器的值,当计数器当前值减去保存的值的差值达到某个时间时,就到时间了
要注意一定要算差值,然后再比较,因为计数器是循环的,后读出来的数据有可能小于先读出的数,不要直接比大小。
当时间到了,要把当前的时间作为基准时间作为继续查询是否到时的依据。

本站还有精度达到微秒的计数器的使用方法,可以在程序源码栏目里面找到。

另外可以用线程的办法,在单独线程里面用 Sleep 或其它延时的办法精度也可以达到 1 毫秒,
但是在到时间时处理数据时间长,拖延了时间就不能达到精度了。
但是用延时的办法要节省 CPU 资源, 在延时的过程中 CPU 空闲, 可以做别的事。

--------------------next---------------------

阅读(1079) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~