gtk/c在一个线程中操纵GUI:奇怪的错误

问题描述:

我用udp编写了一个C/S应用程序,它不断给我提供错误,我相信这与我使用线程的方式有关。gtk/c在一个线程中操纵GUI:奇怪的错误

当客户端程序启动时,它首先初始化一个登录窗口并启动一个新线程来侦听来自服务器的响应。提交用户名和密码后,新线程将收到一条消息,指示是否提交了正确的信息。如果是这样,那么线程将初始化主GUI窗口。但它会给奇怪的错误:

Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0 

python: Fatal IO error 0 (Success) on X server :0.0 

我发现了一个类似的问题here,但它没有解决。

有人说GUI只能在主线程中操作,但其他人却说这不是真的。

我也尝试过使用gdk_threads_enter()gdk_threads_enter()gtk_main()和代码,我初始化窗口在那个监听线程。但它似乎没有工作。

我对线程不太了解,因此请耐心指出我做错了什么地方。

谢谢。

这些错误消息,我发现,时不时弹出,当你没有正确持有GTK锁。

你应该把gdk_threads_enter()gdk_threads_leave()周围原来gtk_main()号召,周围的每一个呼叫到GTK功能,发生

  • 从中你叫gtk_main()
  • 但不是线程之外信号,空闲或超时处理程序。

虽然据我所知,这种用法仍在出路,而在未来的GTK版本中,只能从主线程操纵GTK。

+0

昨天我想到了这一点,但我有另一个问题:无法弄清楚如何在textview中更改为字体样式。我找到fontchooser等,但不知道如何申请... – Gnijuohz 2012-07-16 16:24:22

确实,GTK窗口应该只能从主线程操纵。

这就是说,在某些体系结构(特别是GNU/Linux的),你可以操纵 GTK窗口从另一个线程只要你正确地gdk_threads_enter()/gdk_threads_leave()使用全局锁。关键词是“恰当地”,这并不像看起来那么容易。

这表示,在某些体系结构(特别是MS-Windows上)这样做可能好像在某个简单的程序工作,但在更复杂的惨败。

关于你的问题,你不要说,但你似乎在某处使用Python,但你不会说在哪里...混合Python和本地线程可能不是一个好主意。