Dict.CN 在线词典, 英语学习, 在线翻译

学海苦作舟,书山勤为径

留下点回忆

常用链接

统计

积分与排名

Denoise

English study

Web技术

数据压缩

一些连接

最新评论

windows user模式实现小于1ms的定时器

在阅读本文之前,大家可以参考这个文章: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 笨笨 阅读(2460) 评论(5)  编辑 收藏 引用

评论

# 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以上。
而你说的记时精度当然可以更小,但我的主题有什么关系?我说的是定时,也就是让定时器隔段时间回调你。  回复  更多评论   

# re: windows user模式实现小于1ms的定时器 2011-01-04 14:10 路过

不用那么麻烦.
1 创建一个socket句柄,之后什么都不用设置.
2 直接在这个socket句柄上进行select,即可得到定时延迟.

就是说,只要有一个空的socket句柄,select函数的超时功能就是好使的.
我测试发现能够达到0.9ms的延时精度.cpu为0.  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理