有没有办法在 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 事件处理机制从来都不是为精确而设计的。
最后,您最好的选择可能是
- 使用传统的 signal-based 计时器(例如,来自
setitimer
),或者
- 生成一个新线程,并且只是
usleep()
操作之间的固定时间。
这两种方法在 GTK 中都有问题,因为很难从 GTK 主上下文线程之外更新用户界面。通常需要一些相当复杂的锁定和 inter-thread 通信。
如果可行——我不知道是否可行——我会建议将计时部分委托给某个单独的进程,并让 GTK 应用程序使用例如套接字与其交互。
我想要一个函数,每 N 毫秒 运行,我希望它精确 运行(相对而言,我不需要原子钟精度)。
据我所知,GLib 手册说 g_timeout_add()
不能保证精度,可能会因其他事件而延迟。
有没有其他方法可以使用 GTK/GLib 获得精确的时间事件?我宁愿不使用特定于平台的代码,因为我希望我的程序在 Windows 和 Linux 上工作,并且尽可能少地更改与平台相关的代码。
没有更多细节 g_usleep
可能是您最好的选择,但请记住它会阻塞当前线程,因此如果您希望其他任务并行进行,您需要生成一个新线程以运行它在。
“非原子钟”有多精确?最后,计时精度将受到平台 context-switching 行为等因素的限制。除非您使用的是客户内核或专业硬件,否则您可能无能为力。
g_timeout_add()
是双重问题,因为它的操作与 GTK 事件处理机制纠缠在一起,而 GTK 事件处理机制从来都不是为精确而设计的。
最后,您最好的选择可能是
- 使用传统的 signal-based 计时器(例如,来自
setitimer
),或者 - 生成一个新线程,并且只是
usleep()
操作之间的固定时间。
这两种方法在 GTK 中都有问题,因为很难从 GTK 主上下文线程之外更新用户界面。通常需要一些相当复杂的锁定和 inter-thread 通信。
如果可行——我不知道是否可行——我会建议将计时部分委托给某个单独的进程,并让 GTK 应用程序使用例如套接字与其交互。