繁体   English   中英

GTK3 python 中的线程

[英]Threading in GTK3 python

我正在 Python 中构建一个 GTK GUI,我需要从数据库中获取一些需要很长时间的数据,因此 GUI 冻结。

所以我现在使用线程在“后台”运行刷新:

Thread(target=self.updateOrderList).start()

我有 GUI class 和所有相关的方法来操作 GUI。 我的解决方案在 80% 的时间里都能正常工作,但是当它不工作时 GTK 崩溃并输出:

[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python3.6: ../../src/xcb_io.c:165: dequeue_pending_request:

其他时候效果很好,数据被加载并刷新了 gui。

编辑:有时我会收到此错误:

Gdk-Message: 11:13:42.848: main.py: Fatal IO error 11 (Die Ressource ist zur Zeit nicht verfügbar) on X server :0

有时我多次单击刷新按钮并且它可以工作,但有时它不会。

我的 main.py 看起来像这样:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject

import gui

GObject.threads_init()

# start gui
gui.Gui()
Gtk.main()

有什么想法吗?

马库斯

好吧,GTK3 不是线程安全的。 所以我改变了程序逻辑——在一个新线程中执行请求,并且在 GUI 线程中处理 GUI 操作。 所以这意味着我必须向事件循环发出“请求完成”信号:

创建一个新信号并注册它:

GObject.signal_new("my-custom-signal", self.window, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT,
                       (GObject.TYPE_PYOBJECT,))
self.window.connect("my-custom-signal", self.updateOrderListCallback)

所以当我点击一个按钮时,启动一个线程:

Thread(target=self.updateOrderListThread).start()

在那个线程中,进行计算,然后发出信号:

self.window.emit("my-custom-signal", None)

因此,在计算/请求/完成任何操作之后将调用回调并且它可以工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM