Chinaunix首页 | 论坛 | 博客
  • 博客访问: 276336
  • 博文数量: 55
  • 博客积分: 1328
  • 博客等级: 中尉
  • 技术积分: 731
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-27 16:33
文章分类

全部博文(55)

文章存档

2012年(55)

分类: LINUX

2012-03-16 10:56:29

我们知道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没有其它消息要处理,而且没有更高优先级的工作要做时,就认为处于空闲状态。
阅读(2803) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~