Gtk线程刷新界面
唉,好怀恋Windows啊,那界面处理的刷刷的,线程处理的遛遛的,不管你如何风吹雨打……
可怜的我,整整一周时间,忙着不停的封装调试,然后线程,同步,线程,界面……终于在五一
这样一个伟大的日子前搞定了,向劳动人民致敬……窃以为,做为一个纯情小男人五四青年节
应该也有假的,但是dog sun的咋就不放呢……
-----------------------------------------------------------------------------------------
Linux的开发,才接触2周时间,所以自己所写的东西只是自己的一些理解,仅供参考。
一. 问题原因
在Gtk编程的时候,可能会有从线程中刷新界面的需求,这个时候可能会给你带来一些问题。
Gtk中,所有的界面操作到最后都是在gtk界面的主循环中搞定的,不管在哪个地方操作界面,也
只是向这个循环添加一个事件而已(当然这个过程是不需要你编程完成),由主循环根据事件的优
先级一个个的完成。 ……,
强调一点:gtk不是线程安全的。如果创建了线程,然后在线程中刷新界面,则可能得不到想要的
结果甚至可能引起程序崩溃。
二.解决方法
没时间研究更好的方法了,因为毕竟在线程中更新界面不是一件很好的事情。 将就着解决下:
利用g_thread_init, gdk_threads_init, gdk_threads_enter, gdk_threads_leave……
[1] g_thread_init:
// 初始化线程安全
if ( !g_thread_supported() )
{
printf("[%s]--Init g_thread.\r\n", __FUNCTION__);
g_thread_init(NULL);
gdk_threads_init();
}
Linux下,文档和一些命名总是那么奇怪, g_thread_supported() 唉,这娃的意思是,有没有初始化过,
而不是系统支不支持的意思,所以呢 前面的“!”不是笔误……
g_thread_init函数,帮助文档里不直接写上初始化要在gtk_init()前调用,在 gdk_threads_init()函数的
帮助中重点提示: g_thread_init函数 在gtk_init()前调用……
[2] 然后……
gdk_threads_enter();
gtk_main ();
gdk_threads_leave;
[3] 再然后……
线程里要更新界面的地方:
gdk_threads_enter();
……
gdk_threads_leave;
[4] 再然后……如果你编译不过去
-lgthread-2.0
-----------------------------------------------------------------
Linux小菜鸟,随便写点……希望没写错