我想用C++实现某些系统,以便可以调用一个函数并要求在X毫秒内调用另一个函数。像这样:
callfunctiontimed(25, funcName);
25是应调用该函数之前的毫秒数。
我想知道是否为此需要多线程,然后使用一些延迟功能?除了使用函数指针之外,类似的功能将如何工作?
最佳答案
许多人在此问题上都做出了很好的回答,但是我会直接解决这个问题,因为几年前我也遇到过类似的问题。由于某些原因,我无法使用Boost。我知道Boost在许多开源软件中都有出色的用途。此外,我真的很想特别了解计时器和回调,因为它们与基于Linux的环境有关。所以,我写了我自己的。
从根本上讲,我有一个Timer
类和一个TimerCallback
类。一个典型的回调(实现为TimerCallback
类的继承类)将把要在回调时执行的操作放在triggered ()
方法中,该方法专门为需要而实现。
按照通常的语义,Timer
对象与回调对象相关联,该对象可能包含执行回调所需的所有必需信息。计时器调度由一个环境范围的计时器minheap管理,该计时器必须在单独的线程/进程中维护。这个minheap任务只做一件事:它最小化将来设置的回调事件的最小堆。 Minheap选择要在O(1)
中触发的下一个事件,并且可以为O(log n)
计时器事件最小化n
中的其余事件。它还可以在O(log n)
中插入一个新的计时器事件(阅读有关堆here的详尽介绍)。
当计时器触发时,minheap调度程序会检查它是否为定期计时器,一个触发计时器或将执行特定次数的计时器。因此,将计时器对象从minheap中删除,或在下一次执行时间重新插入minheap中。如果要删除计时器对象,则将其从minheap中删除(但是计时器对象的删除可能会也可能不会留给创建它的任务),其余的堆会进行minheap标准化;即重新排列以满足minheap属性。
一个经过工作和单元测试的实现是here,并且可能包含错误(摘自我的应用程序),但我认为这可能会对某人有所帮助。该实现基于多进程(fork()
ed-process)(并且在主要任务(进程)中也使用pthread
),并且使用POSIX共享内存和POSIX消息队列在进程之间进行通信。
关于c++ - C++实现定时回调函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12904098/