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小菜鸟,随便写点……希望没写错

 

 

posted @ 2010-04-30 14:02  zhengzongzhao  阅读(2145)  评论(0编辑  收藏  举报