有没有办法在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应用程序使用例如套接字的方式与之交互。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...