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

问题描述

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

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

解决方法

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

,

“不是原子钟”有多精确?最后,时序精度将受到平台上下文切换行为等因素的限制。除非您使用客户内核或专业硬件,否则您将无能为力。

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

最后,最好的选择也许是

  1. 使用常规的基于信号的计时器(例如,来自setitimer的计时器),或
  2. 产生一个新线程,两次操作之间的固定时间只是usleep()

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

如果可行-我不知道是否会-我建议将计时部分委派给一些单独的过程,并让GTK应用程序使用例如套接字的方式与之交互。