免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4746 | 回复: 5
打印 上一主题 下一主题

求教关于gtk中多线程控制窗口显示和隐藏的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-20 11:48 |只看该作者 |倒序浏览
环境:两个线程,主线程创建一个窗口,另外一个线程通过socket与另外一个进程连接,接收来自另外进程的控制命令进行gtk_widget_show和gtk_widget_hide.
问题:第一次接收show命令窗口正常显示,但接收到hide命令,调用gtk_widget_hide后窗口消失,整个系统就慢慢卡死了,底下任务栏的任务框不断闪屏,
         再执行gtk_widget_show也没有响应。
      
请教高手可知这是什么情况?

附上伪代码:
       read(cmd) ;      //from socket
       if (cmd = show)
         {
               gdk_threads_enter();
               g_idle_add((GSourceFunc)gtk_widget_show, window);
               gdk_threads_leave();
         }      
      else
         {
               gdk_threads_enter();
               g_idle_add((GSourceFunc)gtk_widget_hide, window);
               gdk_threads_leave();
         }

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
2 [报告]
发表于 2011-04-20 12:22 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2011-04-20 15:31 |只看该作者
没有人有过类似的需求吗

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
4 [报告]
发表于 2011-04-20 17:40 |只看该作者
回复 3# 秦朝茄子


    你贴的伪代码中 gdk_threads_enter/leave是不必要的,因为使用的是glib中的函数不是gtk的(g_idle_add不是gtk的函数)。

gdk_threads_enter/leve需要 gdk_threads_init 后才有作用。而你使用了gdk_threads_init就表示你要在多线程中使用gtk,gtk底层使用glib,实际上就在多线程环境中使用了glib,这就需要 g_thread_init。

是不是你程序其他地方有问题?

论坛徽章:
0
5 [报告]
发表于 2011-04-22 15:02 |只看该作者
问题解决了,是回调函数的问题。
把改成gtk_widget_show改成
gboolean window_show(GtkWdiget *window)
{
      gtk_widget_show(window);
      return FALSE;
}

论坛徽章:
0
6 [报告]
发表于 2011-04-22 15:03 |只看该作者
多谢你的回帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP