select实现精确定时器

select实现精确定时器

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
struct timeval { long tv_sec; long tv_usec; } /* seconds and microseconds */

秒级定时器

void sec_sleep(unsigned sec) {
    int err;
    struct timeval tv;
    tv.tv_sec = sec;
    tv.tv_usec = 0;
    do {
           err = select(0, NULL, NULL, NULL, &tv);
    } while (err < 0 && errno == EINTR);
}

毫秒级定时器

void msec_sleep(unsigned long msec) {
    int err;
    struct timeval tv;
    tv.tv_sec = msec / 1000;
    tv.tv_usec = (msec % 1000) * 1000;
    do {
           err = select(0, NULL, NULL, NULL, &tv);
    } while (err < 0 && errno == EINTR);
}

微秒级定时器

void usec_sleep(unsigned long usec) {
    int err;
    struct timeval tv;
    tv.tv_sec = usec / 1000000;
    tv.tv_usec = usec % 1000000;
    do {
        err = select(0, NULL, NULL, NULL, &tv);
    } while (err < 0 && errno == ENTR);
}
时间: 2024-10-11 22:05:24

select实现精确定时器的相关文章

非实时系统精确定时器的实现

我们通常使用的系统,不管是linux还是windows,都是非实时系统.非实时系统可以获得很精确的当前时间,甚至可以通过读取cpu的某些寄存器得到以cpu周期计数的时钟,估计除了GPS系统之外足以应付我们日常能够碰到的应用,但是,非实时系统并没有提供精确的定时器实现.如果在linux或者windows系统中使用系统定时器,尽管我们可以创建精度为1ms甚至更小的定时器,但是实际执行的时候可以发现,定时器总是需要几ms甚至十几ms才会被调度一次,而不能达到期望的精度. 通常情况下10ms量级的定时器

iOS 精确定时器

Do I need a high precision timer? Don't use a high precision timer unless you really need it. They consume compute cycles and battery. There can only be a limited number of high precsion timers active at once. A high precision timer is "first in line

LInux下几种定时器的比较和使用

在数据通信过程中,会遇到对数据发送时间的格式要求.所以要在应用中根据实际要求选择不同的定时器,就要考虑到几种应用定时器的特点. 定时器文章参考 一般而言有, 1.sleep,usleep和nanosleep sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同.Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上,sleep(

Linux定时器 使用

1.alarm alarm()执行后,进程将继续执行,在后期(alarm以后)的执行过程中将会在seconds秒后收到信号SIGALRM并执行其处理函数. #include <stdio.h>#include <unistd.h>#include <signal.h>void sigalrm_fn(int sig){    printf("alarm!\n");    alarm(2);    return;}int main(void){    s

linux c中select使用技巧

1.select函数作为定时器使用    it_value.tv_sec = 0;    it_value.tv_usec = 100000:    select(1,NULL,NULL,NULL,&it_value);   上面的代码并不是立即返回而是等待100ms,可以作为定时器使用,并且准确度比sleep高.2.linux平台下select函数修改超时时间select_timeout.tv_sec = 10;select_timeout.tv_usec = 0:for(;;){ if(se

精确获取时间(QueryPerformanceCounter)

LARGE_INTEGER tima,timb; QueryPerformanceCounter(&tima); 在 Windows Server 2003 和 WindowsXP 中使用 QueryPerformanceCounter 函数的程序可能执行不当 QueryPerformanceCounter 來精確計算執行時間QueryPerformanceCounter 來精確計算執行時間// 這個程式展示了如何使用QueryPerformanceCounter 來精確計算執行時間//代码 1

定时器的使用

定时器(Timer)在 Windows 的程序设计中很多地方都能用到,他的主要用途是按程序的设定间隔时间,间歇性的产生 WM_TIMER 消息,发送到指定窗口 之后,在窗口中对 WM_TIMER 消息进行处理,完成指定的任务! ①.定时器函数的讲解: ◆ 定时器启动函数:SetTimer UINT SetTimer( UINT nIDEvent, //定时器标识 UINT nElapse, //定时器间隔 void (CALLBACK EXPORT* lpfnTimer)(HWND, //定时器

Windows中7种定时器(VC定时器种类及占用资源对比)

VC中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作.本文详细介绍了VC中基于Windows的精确定时的七种方式,如下图所示: 图一 图像描述 方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作.这种定时方法非常简单,可以实现一定的

《JavaScript修炼之道》读书笔记

1.参考书目 入门:<JavaScript DOM编程艺术>第二版 进阶:<JavaScript高级程序设计>第二版.<JavaScript编程精粹> <JavaScript权威指南> 2.引言 Node.js是CommonJS的一个部分实现 本书代码下载: http://github.com/tdd/pragmatic-javascript https://github.com/tdd/pragmatic-javascript/archive/master