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函数里面,啥原因?

如何在 Linux/Mac 上调用特定的 EXE 函数

如何在mvc 4中的特定间隔后重复调用方法[关闭]

在 C/C++ 程序中,系统(windows、linux、mac OS X)如何调用 main() 函数?

Linux#11 shell脚本函数

如何在 iOS 中的特定时间运行函数?