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