我正在制作一个包含数字时钟的 X 应用程序。时钟以“hh:mm”的格式显示当前时间。我想掌握Xlib,所以我只想使用Xlib(没有其他工具包)。
时钟必须每分钟刷新一次。为了刷新时钟,我想出了三种实现方式,但我无法判断哪一种是最好的。请告诉我哪个最好。并且,如果还有其他更好的实现,请告诉我。
第一个实现从事件循环内部刷新时钟。第二个和第三个实现从事件循环外部刷新时钟。
第一个实现如下:在事件循环中,我使用 XEventsQueued 或 XPending 来了解剩余事件的数量。如果仍然没有事件,请检查当前时间,如果自上次刷新以来已经过了 1 分钟或更长时间,我会刷新时钟。如果还有一些事件,我会处理其他窗口事件。
第二种实现如下:我使用setitimer,间隔1分钟。信号处理程序捕获 SIGALRM 并刷新时钟。
第三种实现如下:我使用pthread。线程函数刷新时钟并休眠 1 分钟,并永远做同样的事情。
第一个实现是最简单的。但我担心它会频繁重复事件循环并消耗CPU电量。
答案1
第一个实现如下:在事件循环中,我使用 XEventsQueued 或 XPending 来了解剩余事件的数量。如果仍然没有事件,请检查当前时间,如果自上次刷新以来已经过了 1 分钟或更长时间,我会刷新时钟。如果还有一些事件,我会处理其他窗口事件。
在极少数情况下,这将失败,因为 1 分钟内没有任何事件。
第二种实现如下:我使用setitimer,间隔1分钟。信号处理程序捕获 SIGALRM 并刷新时钟。
完全没问题。
第三种实现如下:我使用pthread。线程函数刷新时钟并休眠 1 分钟,并永远做同样的事情。
完全没问题。
答案2
所有Sleep 1分钟的方法都会漂移,因为你做了其他操作,循环会花费1分钟多一点的时间。
只需等待一分钟,就会导致时钟在一分钟内的任意时间滴答作响。这将导致时钟误差最多一分钟。
相反,计算到下一分钟还有多长时间,并为该时间设置一个计时器。或者为那个时间设置一个事件。