用于定期调用函数的 API
API for calling function in periodic time intervals
在最近的一次采访中有一个有趣的问题,就在这里。
需要实现一个函数,它将接受一个函数指针和一个时间间隔。它应该使func1
每time_interval
都被称为。
我们提供了一个 API,每个时钟滴答都会调用该 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的倍数,我们调用该函数。
有什么有趣的解决方案吗?
"我建议创建一个函数指针的链接列表"
请注意,这种实现必须在每次新报价时一遍又一遍地遍历所有计划的事件,只是为了找出是否应该调用某个函数。
更好的方法是使用具有明确定义顺序的排序数据结构,假设一个优先级队列,其中所有事件将按顺序排序,它们应该在其中处理/执行。 即:
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
等等。
这是一个很好的答案。 为避免在每次报价时减少链接列表中的每个计时器,您可以搜索将首先过期的计时器,并记下其到期时间。 然后每刻一次递减该计时器,当它到期时,将其余计时器减少存储的到期时间,同时找到下一个将要过期的计时器,然后重复该过程。这样,您只需在计时器过期后遍历链接列表
相关文章:
- 调用 Win32 API 函数时未定义的引用
- 谁拥有作为指向 Windows API 函数的指针传递的值?
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 如何在应用程序正在运行的系统上查看所需的Windows API函数
- 我的 API 函数应该shared_ptr还是weak_ptr
- 将 API 函数参数从 'char *' 更改为"const char *"有哪些潜在问题?
- 当涉及数组时,我们是否可以安全地从C++调用C API函数
- 从 Windows KMD 调用用户空间 API 函数
- 写入const API函数(C )中的成员变量
- 毒害某些API函数(不是维护者)
- win32 API 函数 GetModuleFileName 或 GetModuleHandle 中的"Module"是什么?
- 将指针传递给API函数
- 如何通过重用单个API函数来调用不同的操作
- 将 ASCII 字符串转换为 UTF-16,然后再将它们传递给 Windows API 函数
- POSIX 或 Linux API 函数,用于从路径获取文件扩展名
- 如何正确调用 UrlCanonicalize API 函数
- 找不到Win32 API函数
- 将 AfxGetInstanceHandle() 的调用替换为 Windows API 函数
- 包装任何API函数
- Windows API函数不可用,但它应该可用