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

发布于 2022-10-15 09:04:53 字数 1314 浏览 46 评论 0

环境:两个线程,主线程创建一个窗口,另外一个线程通过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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦巷 2022-10-22 09:04:53

没有人有过类似的需求吗

橘香 2022-10-22 09:04:53

回复 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。

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

一念一轮回 2022-10-22 09:04:53

问题解决了,是回调函数的问题。
把改成gtk_widget_show改成
gboolean window_show(GtkWdiget *window)
{
      gtk_widget_show(window);
      return FALSE;
}

变身佩奇 2022-10-22 09:04:53

多谢你的回帖

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文