C++ 在C/C+中每隔100ms重新启动一次计时器+;

C++ 在C/C+中每隔100ms重新启动一次计时器+;,c++,c,timer,C++,C,Timer,我正在使用一个应用程序,其中要求每100毫秒执行一个函数。 下面是我的代码 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

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

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()上必须在连续等待100毫秒后执行函数。 目前,由于checkOCIDs()函数需要100毫秒以上的时间才能完成,并且在触发计时器超时之前,应用程序将执行一个块。 我不希望将while(1)与sleep()/usleep()一起使用,因为它会极大地消耗我的CPU。
请建议一个替代方案以达到我的要求。

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

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
}

请注意,可能需要额外的同步来避免争用条件(例如,当一个线程存在时,循环和检查仍处于设置状态,而另一个设置计时器已过期时,将不会执行检查功能),但这取决于您的需求详细信息。

Thanku“frymode”:-)只是为了澄清您的疑问,理想的工作方式是,执行checkOCIDs()等待100ms,再次执行checkOCIDs()等待100ms,然后应该继续。我当前的实现不是这样的:-(。上面建议的变量的使用将很有帮助,因为这应该是一个循环。我正在寻找类似计时器重新启动/超时操作的东西,以符合我的需求中的预期。该需求是有缺陷的。如果您有运行
Foo()的硬实时需求
每N毫秒,您就有一个隐含的要求,
Foo
必须在100毫秒内运行。如果
Foo()
不在您的控制范围内,您不能声明
Foo
的要求,甚至不能间接说明。或者,该要求意味着您不能使用
Foo
。是的!!您说得对……处理程序函数的执行不在我的控制范围内。我的意思是要有checkOCIDs()连续延迟100毫秒后执行的函数(每次执行完成后-延迟-执行-延迟-执行-延迟)。