0

我使用 udp 编写了一个 C/S 应用程序,它不断给我错误,我认为这与我使用线程的方式有关。

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

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

或者

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

我在这里发现了一个类似的问题,但没有解决。

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

我还尝试使用gdk_threads_enter()and gdk_threads_enter()aroundgtk_main()以及在该监听线程中初始化窗口的代码。但它似乎没有用。

我对线程了解不多,所以在指出我做错的地方时要耐心等待。

谢谢。

4

2 回答 2

1

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

您应该放置原始调用,以及gdk_threads_enter()发生的 GTK 函数的每次调用gdk_threads_leave()gtk_main()

  • 在您调用的线程之外gtk_main()
  • 但不在信号、空闲或超时处理程序中。

尽管据我了解,这种用法正在逐渐消失,并且在 GTK 的未来版本中,只能从主线程操作 GTK。

于 2012-07-16T08:51:10.297 回答
0

确实 GTK 窗口应该只从主线程中操作。

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

也就是说,在某些体系结构(尤其是 MS-Windows)中,这样做似乎在一些简单的程序中有效,但在更复杂的程序中会惨遭失败。

关于您的问题,您没有说出来,但您似乎在某处使用 Python,但您没有说在哪里......混合 Python 和本机线程可能也不是一个好主意。

于 2012-07-12T14:41:16.650 回答