问题描述
我想拥有一个每N毫秒运行一次的函数,并且我希望它能够精确运行(相对而言,我不需要原子钟精度)。
据我所知,GLib手册说g_timeout_add()
不能保证精度,并且可能由于其他事件而延迟。
还有其他方法可以使GTK / GLib具有精确的时间事件吗?我宁愿不使用平台特定的代码,因为我希望我的程序在Windows和Linux上都可以运行,并且与平台相关的代码更改尽可能少。
解决方法
如果没有更多详细信息,g_usleep
可能是最好的选择,但是请记住,它会阻塞当前线程,因此,如果您希望其他任务并行进行,则需要生成一个新线程来运行它内。
“不是原子钟”有多精确?最后,时序精度将受到平台上下文切换行为等因素的限制。除非您使用客户内核或专业硬件,否则您将无能为力。
g_timeout_add()
双重问题,因为它的操作与GTK事件处理机制纠结在一起,而GTK事件处理机制从来都不是为精确而设计的。
最后,最好的选择也许是
- 使用常规的基于信号的计时器(例如,来自
setitimer
的计时器),或 - 产生一个新线程,两次操作之间的固定时间只是
usleep()
。
这两种方法在GTK中都是有问题的,因为很难从GTK主上下文线程之外更新用户界面。通常需要一些相当复杂的锁定和线程间通信。
如果可行-我不知道是否会-我建议将计时部分委派给一些单独的过程,并让GTK应用程序使用例如套接字的方式与之交互。