如何在 C(不是 C++)中实现 Javascript 的 setTimeout() 函数
How to implement Javascript's setTimeout() function in C (not C++)
标题说明了一切。
我见过 C++ 中的解决方案。例如, 和一些(也包括 C++)相当古老。
我愿意使用 glib 或任何其他开源库。我只关心 Linux 实现。
我遇到了 glib 的 timer functions,但它们本质上都是同步的,并且与 setTimeout() 的作用不接近。
我可以想到一种解决方案,即拥有一个单独的线程,该线程在循环中不断检查计时器(例如 Glib 提供的计时器)是否已过期,然后触发相应的函数。当然,那样效率低得离谱。
我也遇到了这个 here,它建议使用 alarm(2)。它可以使用,但粒度仅以秒为单位。
编辑:唉 alarm() 取消了任何之前设置的 alarm()
您提到您的进程中需要多个计时器,因此您可能需要 POSIX timer_*
系列函数(timer_create
、timer_settime
等).它们具有纳秒粒度。您可以为计时器到期时指定几个不同的操作:发出信号或从单独的线程调用函数。您必须 link 和 -lrt
才能使用这些功能。
还有 timerfd_create
,它允许您使用 poll
或 select
或它们的亲戚通过文件变得可读来检测计时器过期。
如果您想在主循环回调中使用 GLib 及其超时源 (g_timeout_add()
, g_timeout_add_seconds()
, etc.), then you will need to run a GLib main loop (GMainLoop
) 和 运行 应用程序的其余部分。如果您的应用程序尚未以事件驱动的风格编写,这将是一个相当大的变化,但对于轮询套接字或 运行 宁 UI 无论如何都是必需的。
有一个如何在应用程序中使用超时源的示例 。
请注意,GLib 的计时器 API (g_timer_*()
) 不是用于 运行 特定超时后的回调,而是用于计时某事需要多长时间(如秒表)。与这里无关。
标题说明了一切。
我见过 C++ 中的解决方案。例如,
我遇到了 glib 的 timer functions,但它们本质上都是同步的,并且与 setTimeout() 的作用不接近。
我可以想到一种解决方案,即拥有一个单独的线程,该线程在循环中不断检查计时器(例如 Glib 提供的计时器)是否已过期,然后触发相应的函数。当然,那样效率低得离谱。
我也遇到了这个 here,它建议使用 alarm(2)。它可以使用,但粒度仅以秒为单位。
编辑:唉 alarm() 取消了任何之前设置的 alarm()
您提到您的进程中需要多个计时器,因此您可能需要 POSIX timer_*
系列函数(timer_create
、timer_settime
等).它们具有纳秒粒度。您可以为计时器到期时指定几个不同的操作:发出信号或从单独的线程调用函数。您必须 link 和 -lrt
才能使用这些功能。
还有 timerfd_create
,它允许您使用 poll
或 select
或它们的亲戚通过文件变得可读来检测计时器过期。
如果您想在主循环回调中使用 GLib 及其超时源 (g_timeout_add()
, g_timeout_add_seconds()
, etc.), then you will need to run a GLib main loop (GMainLoop
) 和 运行 应用程序的其余部分。如果您的应用程序尚未以事件驱动的风格编写,这将是一个相当大的变化,但对于轮询套接字或 运行 宁 UI 无论如何都是必需的。
有一个如何在应用程序中使用超时源的示例
请注意,GLib 的计时器 API (g_timer_*()
) 不是用于 运行 特定超时后的回调,而是用于计时某事需要多长时间(如秒表)。与这里无关。