我打算编写一个带有 GUI 前端的网络应用程序,大概使用 GTK。
我对 GTK(以及一般的 GUI 编程)完全陌生。我目前的猜测是使用两个线程,一个处理网络,另一个运行 GTK 前端。
这是此类问题的常见设计模式还是有更好的替代方案,例如从 GTK 主循环内处理网络?
如果我必须使用两个线程,那么告诉 GTK 线程网络线程有可用数据的最佳方法是什么?
最佳答案
GTK+ 的正常处理方式是将 GUI 放在主线程上,而缓慢的操作则在其他线程上完成。请注意,当您想从另一个线程更新 GUI 时,您必须这样做 inside the GDK lock 。文档提到“对于 Win32 后端,根本不应该从多个线程尝试 GDK 调用”,但可以使用 g_idle_add 来解决这个问题。 ,它将 GUI 线程上的调用排队。
您可以使用异步 GIO 函数(例如 g_input_stream_read_async )进行网络操作,但没有什么可以阻止您使用通用线程库,例如:
gtk.gdk.threads_init()
...
def on_button_clicked(button):
label.set_text("Doing something...")
threading.Thread(target=do_something).start()
def do_something():
time.sleep(2)
glib.idle_add(label.set_text, "Done")
之前链接的 GDK Threads documentation 中有一个使用 C(Pthreads)的类似示例。 .
关于python - GTK 网络应用程序 : need design pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371453/