linux c++如何在特定的时间间隔后调用函数

linux c++ how to call function after specific time interval

本文关键字:时间 函数 调用 c++ linux      更新时间:2023-10-16

假设我的程序中有一些函数func(),我需要在特定的延迟后调用它。到目前为止,我在谷歌上搜索了一下,结果得到了以下代码:

#include <stdio.h>
#include <sys/time.h>   /* for setitimer */
#include <unistd.h>     /* for pause */
#include <signal.h>     /* for signal */
void func()
{
    printf("func() calledn");
}
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(。有人能告诉我怎么做吗?也许,我需要一些额外的参数来设置timer()?

注意:时间间隔应该精确,因为这个程序稍后会播放迷笛音乐。

除非你需要程序做其他事情,否则你可以只睡分配的时间。

如果您需要使用警报器,您可以安装一次要处理的警报器。

来自手册页:

结构时间间隔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之外。您所做的是对两个结构使用相同的值,这就是为什么您会看到重复的间隔。