【发布时间】:2020-02-29 22:11:01
【问题描述】:
我正在使用 gtk3 创建 GUI。为了使 GUI 和操作一起工作,我使用以下代码创建了一个线程:threading.Thread(target=function).start()。没有线程,一切正常,但 GUI 将被冻结。使用线程,出现此错误:
第一个是Segmentation fault (core dumped)
第二个是*** glibc detected *** python: double free or corruption (!prev): 0x09154320 ***
第三个是Gtk:ERROR:/build/buildd/gtk+3.0-3.4.2/./gtk/gtktextview.c:3726:gtk_text_view_validate_onscreen: assertion failed: (priv->onscreen_validated) Aborted (core dumped)
你知道为什么会这样吗?
编辑: 我的代码:
GUI.py
from gi.repository import Gtk, Gdk, GLib
import Process
import gobject
import threading
class gui():
def __init__(self):
self.window = Gtk.Window()
self.window.connect('delete-event', Gtk.main_quit)
self.box = Gtk.Box()
self.window.add(self.box)
self.label = Gtk.Label('idle')
self.box.pack_start(self.label, True, True, 0)
self.progressbar = Gtk.ProgressBar()
self.box.pack_start(self.progressbar, True, True, 0)
self.button = Gtk.Button(label='Start')
self.button.connect('clicked', self.on_button_clicked)
self.box.pack_start(self.button, True, True, 0)
self.window.show_all()
GLib.threads_init()
Gdk.threads_init()
Gdk.threads_enter()
Gtk.main()
Gdk.threads_leave()
def working1(self):
self.label.set_text('working1')
result = Process.heavyworks1()
print result
self.label.set_text('idle')
def on_button_clicked(self, widget):
threading.Thread(target=self.working1).start()
if __name__ == '__main__':
gui = gui()
进程.py
a = 0 x = '某事'
def heavyworks1():
#global a
#doing something
#doing other thing
#a = something
#return result
def heavyworks2(param):
#doing something
#doing other thing
#return result
【问题讨论】:
-
您是否尝试从多个线程访问 Gtk+ 对象?大多数 GUI 库都不允许这样做。
-
另外,您是否尝试在没有锁或其他同步的情况下从多个线程访问任何共享的可变对象?由于 GIL,您经常在 Python 中侥幸逃脱,但并非总是如此。而且,除非您真正了解“经常”和“不”的规则,否则您应该始终谨慎行事。
-
无论如何,如果您想要的不仅仅是模糊的提示,您将不得不向我们展示实际的代码。发布一个SSCCE,其中包含足够的代码来演示问题,然后人们可以阅读它甚至调试它,而不是猜测。
-
在线程和 GUI 方面总是有点棘手。有时 GUI-Libs 会提供自己的线程...你检查过 gtk3 文档是否有类似的东西?
标签: python multithreading gtk