在不手动创建线程的情况下定期调用C函数 我在C++中实现了WebStutter处理程序,需要偶尔发送ping消息。但是,我不希望每个套接字启动一个线程/一个只调用ping函数的全局轮询线程,而是使用一些操作系统功能来调用我的计时器函数。在Windows上有SetTimer,但这需要一个有效的消息循环(我没有)。在Linux上有timer\u create,它看起来更好

在不手动创建线程的情况下定期调用C函数 我在C++中实现了WebStutter处理程序,需要偶尔发送ping消息。但是,我不希望每个套接字启动一个线程/一个只调用ping函数的全局轮询线程,而是使用一些操作系统功能来调用我的计时器函数。在Windows上有SetTimer,但这需要一个有效的消息循环(我没有)。在Linux上有timer\u create,它看起来更好,c++,c,windows,linux,timer,C++,C,Windows,Linux,Timer,是否有一些可移植的、低开销的方法来获得定期调用的函数,最好是使用一些自定义上下文?例如,类似于settimer(const int毫秒,const void*上下文,void(*回调)(const void*)) [编辑]只是让这一点更清楚一点:我不想管理额外的线程。在Windows上,我想在系统线程池上使用CreateThreadpoolTimer就可以了,但我很想知道是否有更简单的解决方案以及如何将其移植到Linux。如果您打算跨平台,我建议您使用类似的跨平台事件库 较新,但目前Win32支

是否有一些可移植的、低开销的方法来获得定期调用的函数,最好是使用一些自定义上下文?例如,类似于
settimer(const int毫秒,const void*上下文,void(*回调)(const void*))


[编辑]只是让这一点更清楚一点:我不想管理额外的线程。在Windows上,我想在系统线程池上使用
CreateThreadpoolTimer
就可以了,但我很想知道是否有更简单的解决方案以及如何将其移植到Linux。

如果您打算跨平台,我建议您使用类似的跨平台事件库


较新,但目前Win32支持较弱。

如果您打算跨平台,我建议您使用类似的跨平台事件库


较新,但当前对Win32的支持较弱。

如果使用套接字,则可以使用select来等待具有超时的套接字事件,
在这个循环中,计算时间并在适当的时间调用回调。

如果使用套接字,可以使用select,等待套接字事件超时,
在这个循环中,计算时间并在适当的时间调用回调。

如果您正在寻找一个不需要额外线程的计时器,让您透明地完成工作,然后通过预先中断应用程序在同一线程的适当时间调用计时器函数,那么就没有这种可移植的东西了

第一个原因是它非常危险。这就像编写一个完全没有同步的多线程应用程序。第二个原因是在多线程应用程序中很难有好的语义。哪个线程应该执行计时器回调


如果您正在编写web套接字处理程序,则可能已经在编写基于
select()
的循环。如果是这样的话,那么您可以在短时间内使用
select()
,检查需要ping每个对等方的不同连接。

如果您正在寻找不需要额外线程的计时器,让您透明地完成工作,然后通过预先中断应用程序在同一线程中的适当时间调用计时器函数,那么就没有这种可移植的东西了

第一个原因是它非常危险。这就像编写一个完全没有同步的多线程应用程序。第二个原因是在多线程应用程序中很难有好的语义。哪个线程应该执行计时器回调


如果您正在编写web套接字处理程序,则可能已经在编写基于
select()
的循环。如果是这样,那么您只需在短时间内使用
select()
,并检查需要ping每个对等方的不同连接。

无论何时发生异步事件,都应该有一个事件循环。这不需要是系统默认设置,比如Windows的消息循环。您可以创建自己的。但你应该使用它

基于事件的编程的要点在于,您正在解耦代码处理,以处理基于这些异步事件的定义良好的函数片段。如果没有一个事件循环,您就只能将代码交错,这些代码获取用户的输入,并根据定义不好的“状态”生成输出,这些“状态”只是过程代码的片段

如果没有使用基于事件的设计进行定义良好的状态分离,代码很快就会变得不可管理。因为代码在过程内部暂停以执行输入任务,所以对象的生命周期不会跨越整个过程范围,并且您将开始在访问基于事件创建或销毁的对象的不同位置写入if(nullptr==xx)。分派在本质上变得复杂,因为在每个输入点上都有不同的事件,并且没有抽象

但是,只需使用事件循环和分派到状态机,就可以将处理复杂性降低到处理程序的基本管理(O(n)处理程序与具有n种事件类型和m个状态的O(mn)分支语句相比)。您可以解耦处理,但仍然允许功能根据状态而改变。但是现在这些状态都是使用状态类定义的。如果产品的要求发生变化,可以添加新的状态


我只是说,不要试图避免事件循环。这是一种软件模式,其原因非常重要,所有这些都与生成专业的、可重用的、可伸缩的代码有关。使用Boost.ASIO或其他框架实现跨平台功能。不要因为你认为这样做会减少努力而养成做错的习惯。最后,即使这不是一个需要长期维护的专业项目,您也需要练习使代码专业化,这样您就可以用自己的技能做一些事情。

每当您有异步事件时,您都应该有一个事件循环。这不需要是系统默认设置,比如Windows的消息循环。您可以创建自己的。但你应该使用它

基于事件的编程的要点在于,您正在解耦代码处理,以处理基于这些异步事件的定义良好的函数片段。如果没有一个事件循环,您将不得不交错代码,这些代码获取用户的输入,并根据定义不好的“状态”生成输出