linux c ++如何在特定时间间隔后调用函数
Posted
技术标签:
【中文标题】linux c ++如何在特定时间间隔后调用函数【英文标题】:linux c++ how to call function after specific time interval 【发布时间】:2014-09-27 17:03:28 【问题描述】:假设我的程序中有一些函数 func(),我需要在特定延迟后调用它。到目前为止,我已经用谷歌搜索它并最终得到以下代码:
#include <stdio.h>
#include <sys/time.h> /* for setitimer */
#include <unistd.h> /* for pause */
#include <signal.h> /* for signal */
void func()
printf("func() called\n");
bool startTimer(double seconds)
itimerval it_val;
double integer, fractional;
integer = (int)seconds;
fractional = seconds - integer;
it_val.it_value.tv_sec = integer;
it_val.it_value.tv_usec = fractional * 1000000;
it_val.it_interval = it_val.it_value;
if (setitimer(ITIMER_REAL, &it_val, NULL) == -1)
return false;
return true;
int main()
if (signal(SIGALRM, (void(*)(int))func) == SIG_ERR)
perror("Unable to catch SIGALRM");
exit(1);
startTimer(1.5);
while(1)
pause();
return 0;
它可以工作,但问题是 settimer() 会导致 func() 以 1.5 秒的间隔重复调用。我需要的是只调用一次 func() 。 有人可以告诉我该怎么做吗?也许,我需要一些额外的参数来 settimer() ?
注意:时间间隔要精确,因为这个程序稍后会播放midi音乐。
【问题讨论】:
硬延迟有什么问题? @IgnacioVazquez-Abrams ,如果你的意思是使用 sleep() 函数,问题是它不提供精确的时间间隔,这对于播放音乐是不可接受的 在func()
中停止计时器怎么样?
我强烈建议您考虑以下替代方案:sigaction(而不是“signal()”)和timer_create。查看 timer_create 链接中的示例代码。
从信号处理程序内部调用函数不是一个好主意,这就是你最终会在上面做的事情。 timer_create 系列让您可以选择从单独的线程调用您的函数。
【参考方案1】:
除非您需要程序执行其他操作,否则您只需在分配的时间内睡觉即可。
如果需要使用报警器,可以安装一次处理的报警器。
来自手册页:
struct timeval it_interval
这是连续定时器中断之间的周期。如果为零,则仅发送一次警报。
代替你的代码:
it_val.it_interval = it_val.it_value;
我会设置:
it_val.it_interval.tv_sec = 0;
it_val.it_interval.tv_usec = 0;
除了你已经设置的it_val.it_value。您所做的是对两个结构使用相同的值,这就是您看到重复间隔的原因。
【讨论】:
哦,谢谢,我按照您的建议将时间间隔设置为零:)以上是关于linux c ++如何在特定时间间隔后调用函数的主要内容,如果未能解决你的问题,请参考以下文章
linux 下调用recv函数,死循环在recv函数里面,啥原因?