有没有办法在 GTK/GLib 中有精确的定时事件?

Is there a way to have precise timed events in GTK/GLib?

我想要一个函数,每 N 毫秒 运行,我希望它精确 运行(相对而言,我不需要原子钟精度)。 据我所知,GLib 手册说 g_timeout_add() 不能保证精度,可能会因其他事件而延迟。

有没有其他方法可以使用 GTK/GLib 获得精确的时间事件?我宁愿不使用特定于平台的代码,因为我希望我的程序在 Windows 和 Linux 上工作,并且尽可能少地更改与平台相关的代码。

没有更多细节 g_usleep 可能是您最好的选择,但请记住它会阻塞当前线程,因此如果您希望其他任务并行进行,您需要生成一个新线程以运行它在。

“非原子钟”有多精确?最后,计时精度将受到平台 context-switching 行为等​​因素的限制。除非您使用的是客户内核或专业硬件,否则您可能无能为力。

g_timeout_add() 是双重问题,因为它的操作与 GTK 事件处理机制纠缠在一起,而 GTK 事件处理机制从来都不是为精确而设计的。

最后,您最好的选择可能是

  1. 使用传统的 signal-based 计时器(例如,来自 setitimer),或者
  2. 生成一个新线程,并且只是 usleep() 操作之间的固定时间。

这两种方法在 GTK 中都有问题,因为很难从 GTK 主上下文线程之外更新用户界面。通常需要一些相当复杂的锁定和 inter-thread 通信。

如果可行——我不知道是否可行——我会建议将计时部分委托给某个单独的进程,并让 GTK 应用程序使用例如套接字与其交互。