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

时间:2014-09-27 17:03:29

标签: c++ linux timer

让我说我的程序中有一些函数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音乐。

1 个答案:

答案 0 :(得分:3)

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

如果您需要使用闹钟,可以安装一次要处理的闹钟。

从手册页:

  

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。你所做的就是对两种结构使用相同的值,这就是你看到重复间隔的原因。