void
gettimeofday
(
struct
timeval
*
p
,
void
*
tz
)
LARGE_INTEGER q
;
static
long
long
freq
;
static
long
long
cyg_timer
;
QueryPerformanceFrequency
(
&
q
)
;
freq
=
q
.
QuadPart
;
QueryPerformanceCounter
(
&
q
)
;
cyg_timer
=
q
.
QuadPart
;
p
->
tv_sec
=
(
long
)
(
cyg_timer
/
freq
)
;
p
->
tv_usec
=
(
long
)
(
(
(
cyg_timer
%
freq
)
*
1000000
)
/
freq
)
;
double deviation_sum = 0.0;
double deviation_cnt = 0.0;
double deviation_max = 0.0;
struct timeval lastSent;
struct timeval lastPrint;
gettimeofday(&lastSent, NULL);
while(1)
FD_SET readfd;
struct timeval timeout;
timeout.tv_sec = interval / 1000000;
timeout.tv_usec = interval % 1000000;
gettimeofday(&lastSent, NULL);
int reVal = select(num + 1, &readfd, NULL, NULL, &timeout
在调用
select
() 的
timeout
会倾向于在循环外部进行赋值,以降低不必要的 CPU 消耗,关于
select
()
timeout
上的用法陷阱,很多资深的平台移植人员也掉进过,在 FreeRTOS 平台调用
select
,
timeout
的值在调用前后保持不变,但任何的处理都是要花费时间的,当
select
() 第一次调用完成再次进入循环体时,这个
timeout
的值已经背更新为”剩下的时间“,如 9 秒,这个时候,
select
() 调用的设计不再符合设计者的初衷,
http://fanqiang.chinaunix.net/a4/b7/20010913/0900001283.html【 原文由 cpu 所发表 】 用过 WinSock API 网友们知道:WinSock 编程中有一很方便的地方便是其 息驱动机制,不管是底层 API 的 WSAAsync
Select
() 还是 MFC 的异步Socket类: CAsyncSocket,都提供了诸如 FD_AC
在完善我的跨平台的发邮件类库时,
select
做延时
windows
没效果,Linux正常,还以为我代码写错了呢;在网上搜素下也没发现类似说法,于是我就写了段小测了,果然
select
延时在
windows
上缩水了 #include iostream>#include time.h>#ifdef WIN32#include winsock2.h>#pragma comment(lib,"ws2_
于是用以下方法测试:
用waitforsingleobjec sleept, gettickout QueryPerformanceFrequency、QueryPerformanceCounter来对比,
试了n次后发现,
windows
系统(至少我的电脑上),不管用sleep还是waitforsingleobjec
Windows
定时精度比较
方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Slee