在阅读本文之前,大家可以参考这个文章: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.