簡體   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