Dict.CN 在线词典, 英语学习, 在线翻译
随笔-98  评论-327  文章-0  trackbacks-0

在阅读本文之前,大家可以参考这个文章:VC中基于 Windows 的精确定时.这个文章中对windows中出现的定时方式说明的很清楚,基本是应有尽有。
我也是为了找更短的定时才找到这个文章,但我发现如果实现小于1ms的定时,这些方法都很困难,主要的原因在于使用了太多的CPU(这些方法都是在一个循环中不停检查),这是不能符号要求的。因此必须找到一个新的方法。
在别人提示的情况下,发现socket的select函数有一个使用微秒的等待时间,看下这个函数的原型:

int select(
int nfds,
  fd_set* readfds,
  fd_set* writefds,
  fd_set* exceptfds,
  const struct timeval* timeout
);
第四个参数就是我想要设置的。timeval结构如下:
typedef struct timeval {
long tv_sec;
long tv_sec;
long tv_sec;
long tv_usec; } timeval;

Members

tv_sec
Time value, in seconds.
tv_usec
Time value, in microseconds.

显然,我可以设置微秒的等待时间。
因此如果在select的调用时间内,没有read,wirte和异常时间发生,函数会在timeout时间过后返回,那么就可以实现了定时调用的功能。
基本实现步骤:
1。创建一个线程,建立一个accept的socket。异步的socket。
2。创建另一个线程,用来建立一个socket来连接那个accept的异步的socket。
3。连接建立好之后,使用select函数来查询在socket发生的事件,由于不发送数据,接受数据等,所以每次select都在timeout时间结束后返回,在这个时候执行需要的代码。

我最终得到的结果是CPU使用率在10%-20%(机器不同可能不同),定时精度在0.8ms。基本达到要求。


这里是实现代码。TimeThread.

posted on 2007-11-14 06:04 笨笨 阅读(873) 评论(4)  编辑 收藏 引用

评论:
# re: windows user模式实现小于1ms的定时器 2007-11-14 09:12 | 绝对零度
0.8ms,CPU占用率就达到10%-20%,你是指单纯的定时器,还是包括定时器处理的代码?  回复  更多评论
  
# re: windows user模式实现小于1ms的定时器 2007-11-14 11:24 | neoragex2002
多的是,所有内核对象句柄都可以用来WaitForSingleObject超时,process, thread, mutex, semaphore, socket, file, event, waitabletimer, any pleasure you can image. 但没一个能够保证定时精度<ms, windows不是rtos。

至于计时精度(不是定时精度),那可就高了去了,不止可以精确到最小粒度的内部定时器,甚至可以精确到CPU cycles的,看看QueryPerformanceCounter/Freq和__rdtsc。  回复  更多评论
  
# re: windows user模式实现小于1ms的定时器 2007-11-16 04:42 | 笨笨
@绝对零度
定时,不包括处理代码。我想应该CPU占用率应该可以再小点  回复  更多评论
  
# re: windows user模式实现小于1ms的定时器 2007-11-16 04:45 | 笨笨
@neoragex2002
你说的大家都知道,但完全是精度问题,那些根本就没有设置ms一下的参数,所以他们的定时精度基本和基本的Timer一样,10ms以上。
而你说的记时精度当然可以更小,但我的主题有什么关系?我说的是定时,也就是让定时器隔段时间回调你。  回复  更多评论
  

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航: