GTK+ 多线程
GTK+ 多线程操作
操作 UI 元素时,早期一般都是使用gdk_thread_enter() / gdk_thread_leave() 来进行线程间同步。
但是 GTK+ 3.6 开始,不建议使用该函数对。仔细考虑下,似乎有些道理。频繁的调用 gdk_thread_enter() / gdk_thread_leave()确实影响 GTK+ 的性能,并且容易出现莫名的错误。但是,如何解决在多线程环境下,
其他线程对主UI元素的操作呢?有以下常用的 3 个方法:
1) 使用 signal 机制
这也是一种同步机制,我们需要在主线程添加自定义的信号和该信号的callback函数,
并连接该信号到一个 gobject 上去。在其他线程emit该信号即可。
常用的函数:
1.1 创建自定义的信号: g_signal_new()/g_signal_newv()
1.2 发射信号: g_signal_emit() /g_signal_emit_byname()/ g_signal_emitv()
函数详细说明:且听下回分解
样例代码:且听下回分解
2) 使用 g_idle_add
这个是异步机制,在gtk空闲时执行添加的callback函数
本人认为该机制适用于需要长时间,并优先级不高的操作
函数详细说明:且听下回分解
样例代码:且听下回分解
3) 使用 g_timeout_add()/g_timeout_add_full().
需要定时去作某件事,则可以用该组函数
函数详细说明:且听下回分解
样例代码:且听下回分解