【问题标题】:Is there a way to have precise timed events in GTK/GLib?有没有办法在 GTK/GLib 中有精确的定时事件?
【发布时间】:2020-09-09 21:06:47
【问题描述】:

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

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

【问题讨论】:

  • 你测试过g_timeout_add() 看看它有多不精确吗?您还可以使用g_timeout_source_new() 创建一个计时器源并使用g_source_set_priority() 提高其优先级,这应该在主循环中相对于其他源赋予它更多的调度优先级。这应该会减少抖动。

标签: c events timer gtk glib


【解决方案1】:

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

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

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

  1. 使用传统的、基于信号的定时器(例如,来自setitimer),或者
  2. 生成一个新线程,并在操作之间设置固定时间 usleep()

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多