当我的服务器应用程序从客户端读取输入时,有人建议我使用回调函数来实现在后台运行的计时器。我尝试在线查看解释,但希望有人能给我一个更简单的类比。
感谢。
答案 0 :(得分:2)
在Windows,SetTimer和timeSetEvent中使用回调实现计时器有两种不同的方法。基础是:
即使您使用回调,SetTimer也会使用消息(由于处理消息而调用回调函数)。因此,如果您不运行消息泵,则SetTimer不可行。
操作系统调用回调函数,它不知道来自地洞中的C ++“this”指针,因此您的回调必须是全局C风格函数或静态成员。
timeSetEvent是“多媒体”计时器系列的一部分,不需要消息泵。关于上述回调函数签名的观察仍然适用。如果您正在编写控制台应用程序,则缺少对消息泵的要求非常重要。
您也可以考虑使用线程和CreateWaitableTimer,但我不经常使用等待计时器,因此无法对它们发表评论。
如果您需要在后台工作,那么线程可以是解决问题的更优雅方式。当您进行线程处理时,您不必将工作分成块(如果您从计时器中踢出工作,则会执行此操作)。但是当然你的线程无法触及GUI,因此当你开始线程化时,生活可能会让小变得复杂。我的网站here上有一个工作线程介绍。
答案 1 :(得分:1)
类比?
在这里查看回调函数的简要说明:
What is a “callback” in C and how are they implemented?
使用带回调的计时器会说“每y秒调用一次函数x”并且使用支持多任务的系统,无论原始函数是什么,该函数都会在第二个执行线程中每隔y秒调用一次。正在做。
编辑:正如在另一个答案中所建议的那样,系统可能不会为您创建第二个线程,在这种情况下,您必须自己创建线程并设置该线程的回调。
编辑:在Windows中,您可以使用SetTimer功能。它会将WM_TIMER消息发布到您的窗口的消息队列中,您的消息循环可以自行处理该消息,或者将其移交给默认消息过程以调用您指定的回调函数。我不确定如果你没有窗户会发生什么,但试一试。
答案 2 :(得分:0)
您的问题相当不清楚,但很可能他们建议您创建一个线程并在该线程中运行您的函数。
这可以通过继承系统特定的Thread
类来完成;通过构造具有某种回调函数作为参数的相同类;通过创建一个在一段时间限制后调用回调函数的计时器...没有更具体的问题我不能给出更具体的建议。