在C / C ++中每100ms重启一次计时器

时间:2014-10-13 09:23:02

标签: c++ c timer

我正在使用一个应用程序,其中要求是每100ms后执行一个函数。 以下是我的代码

checkOCIDs()
{
// Do something that might take more than 100ms of time
}
void TimeOut_CallBack(int w)
{
    struct itimerval tout_val;
    int ret = 0;

    signal(SIGALRM,TimeOut_CallBack);

    /* Configure the timer to expire after 100000 ... */
    tout_val.it_value.tv_sec = 0;
    tout_val.it_value.tv_usec = 100000; /* 100000  timer */

    /* ... and every 100 msec after that. */
    tout_val.it_interval.tv_sec = 0 ;
    tout_val.it_interval.tv_usec = 100000;

    checkOCIDs();

    setitimer(ITIMER_REAL, &tout_val,0);

    return ;

}

函数TimeOut_CallBack()只被调用一次然后在checkOCIDs()函数必须在连续等待100ms后执行。 目前,应用程序正在进行一个块,因为checkOCIDs()函数需要超过100毫秒的时间才能完成,在此之前触发Timer Out。 我不希望while(1)与sleep()/ usleep()一起使用,因为它极大地耗尽了我的CPU。 请提出替代方案以达到我的要求。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚“检查”功能是否应在正在进行且定时器到期时执行。也许您可以引入变量来指示计时器已过期,并且您的函数应在完成后再次执行,伪代码:

static volatile bool check_in_progress = false;
static volatile bool timer_expired = false;

void TimeOut_CallBack(int w)
{
    // ...
    if (check_in_progress) {
        timer_expired = true;
        return;
    }

    // spawn/resume check function thread
    // ...
}

void checkThreadProc()
{
    check_in_progress = true;
    do {
        timer_expired = false;
        checkOCIDs();
    } while(timer_expired);
    check_in_progress = false;

    // end thread or wait for a signal to resume
}

注意,可能需要额外的同步来避免竞争条件(例如,当一个线程存在do-while循环且check_in_progress仍然设置而另一个设置timer_expired时,check函数将不会被执行),但这取决于你的要求详情。