2

可能重复:
用户空间中的 Linux C/C++ Timer 信号处理程序

我如何在 C 中创建一个计时器?我想每 5 秒执行一次某个动作,然后每 2 秒执行另一个动作?

我该如何实现这一目标?谁能指出一些好的链接或代码?

4

1 回答 1

0

问题不在于设置一个周期性定时器,而是有两个不同周期的定时器。

不幸的是 2 不能除以 5,但是我们可以有一个 1s 分辨率的计时器和一个计数器,当计数器是 2 的倍数,或者 5 的倍数时,你可以做你想做的事。您像往常一样使用计时器注册信号处理程序,但此处理程序应如下所示:

static int cnt = 0;

int handler(int) {
    cnt++;

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % 5 == 0) {
        action_b();
    }
}

为了摆脱溢出问题,我们可以在达到 2 和 5 的倍数时将计数器重置为 0,例如通过执行以下操作:

int handler(int) {
    cnt++;

    if (cnt == 10)
    {
        cnt = 0;
    }

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % (2*5) == 0) {
        action_b();
    }
}

请注意,这种技术可以很好地推广到 2 个以上的周期,但是如果您运气不好,最小的公分母可能是一个非常小的周期,因此您可能会在很少使用的情况下获得很高的定时器信号率。例如,如果您有一个 999 毫秒的周期和一个 1000 毫秒的周期,那么您最终每毫秒都有一个信号,这在准确性和开销方面并不是很理想,但是对于 2 秒和 5 秒,这应该是可以接受的每秒一个信号。

于 2012-07-02T01:00:46.053 回答