用于以周期性时间间隔调用函数的API

时间:2013-10-19 23:50:47

标签: c++ c data-structures timer implementation

在最近的一次采访中有一个有趣的问题,就在这里。

需要实现一个函数,该函数将接受函数指针和时间间隔。 它应该允许每func1调用time_interval

我们提供了一个API,每个时钟周期都会调用它。 可以有多次调用create_timer,在这种情况下,它应该根据各自的时间间隔调用每个函数指针。

    // api    
    create_timer(&func, interval) 

    // call to api would look like
    create_timer(&func1, 10);
    create_timer(&func2, 5);

我建议创建一个函数指针的链表,但在这种情况下,它是每个时钟周期的线性搜索。这不是一个好的解决方案。

我也建议了一个优先级队列解决方案,但这也没有用。 我们需要存储为每个函数调用create_timer的时间,&然后计算与当前时间的差异,&然后,如果该差异是time_interval的倍数,我们调用该函数。

任何有趣的解决方案?

2 个答案:

答案 0 :(得分:1)

“我建议创建一个函数指针的链接列表”

请注意,这种实现必须在每次新的滴答时反复遍历所有计划事件,只是为了找出是否应该调用某个函数。

更好的方法是使用具有明确定义顺序的排序数据结构,例如 优先级队列 ,其中所有事件将按顺序排序,其中他们应该被处理/执行。即:

create_timer(&func1, 10);
create_timer(&func2, 5);
create_timer(&func3, 15);

可能会导致以下优先级队列:

5   func1
10  func2
15  func3

当计时器达到第5个滴答时,它将调用func1并将其从队列中删除,然后它会将其插回到具有更新值“last val + 5”的队列中:

10  func2
10  func1
15  func3

等等。

答案 1 :(得分:0)

这是一个非常好的答案。为了避免在每个滴答中减少链接列表中的每个定时器,您可以搜索将首先到期的定时器,并记下它到期的时间。然后在每个滴答时递减该定时器,并且当它到期时,将剩余的定时器递减所存储的时间到期,同时找到将到期的下一个定时器,然后重复该过程。 这样,您只能在计时器到期后遍历链接列表