我们知道glib提供了一个名为g_idle_add的函数,这个函数的功能很容易理解:增加一个空闲任务,让应用程序在空闲时执行指定的函数。这种机制
非常有用,如果没有这种机制,很多事情将非常麻烦。它的功能虽然简单,但并不是所有人都知道如何充分发挥它的潜力,这里说说它的几个主要用途吧。
1.
在空闲时执行低优先级任务。有的任务优先级比较低,但费耗时间比较长,像屏幕刷新等操作,我们不希望它阻碍当前操作太久,此时可以把它放到空闲任务里去
做。实际上GTK+里面也是这样做的,这样可以获得更好的响应性。
2. 将同步操作异步化。我们知道在GTK+中,它使用glib的signal作为窗口/控件之间的通信方式,signal的执行是直接调用函数,即整个
signal的执行过程是同步完成的。这在多数情况下工作得很好,但有时会出现重入的问题,你调我,我再调你,可能会遇到麻烦。此时我们不得不采用异步方
式,而GTK+没有提供像Win32下的PostMessage之类的异步消息,幸好我们可以用g_idle_add函数来模拟。
3.
串行化对GUI的访问。在大多数平台下,对GUI资源的访问都是需要串行化的,即在一个GUI应用程序中,只有一个线程可以直接操作GUI资源。这是因为
出于效率的考虑,
GUI资源是没有加锁保护的,GTK+也是这样的。如果另外一个线程要访问GUI资源,比如要显示一条信息,怎么办呢?这可以通过g_idle_add增
加一个空闲任务来实现,idle任务是GUI线程(主线程)中执行的,所以串行了对GUI资源的访问。
这里要注意,idle任务并不是一个独立的线程或者进程,而在是主线程中执行的。所谓空闲是指,当main
loop没有其它消息要处理,而且没有更高优先级的工作要做时,就认为处于空闲状态。
阅读(2849) | 评论(0) | 转发(0) |