求教关于gtk中多线程控制窗口显示和隐藏的问题
环境:两个线程,主线程创建一个窗口,另外一个线程通过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();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
http://bbs.chinaunix.net/thread-2296527-1-1.html
请参考
没有人有过类似的需求吗
回复 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。
是不是你程序其他地方有问题?
问题解决了,是回调函数的问题。
把改成gtk_widget_show改成
gboolean window_show(GtkWdiget *window)
{
gtk_widget_show(window);
return FALSE;
}
多谢你的回帖