【问题标题】:API for calling function in periodic time intervals周期性时间间隔调用函数的API
【发布时间】:2013-10-28 15:19:36
【问题描述】:

在最近的一次采访中遇到了一个有趣的问题,就这样吧。

需要实现一个函数,它将接受一个函数指针和一个时间间隔。 它应该使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 的倍数,我们调用该函数。

有什么有趣的解决方案吗?

【问题讨论】:

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


    【解决方案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
    

    等等。

    【讨论】:

    • 函数必须在create_timer调用后的时间调用,我建议优先队列解决方案,但他不满意。
    【解决方案2】:

    这是一个很好的答案。为避免在每次滴答时递减链接列表中的每个计时器,您可以搜索将首先到期的计时器,并记下其到期时间。然后在每个滴答声中递减该计时器,当它到期时,将其余计时器递减存储的到期时间,同时找到下一个将到期的计时器,然后重复该过程。 这样你只有在计时器到期后才遍历链接列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多