我有一个 QMainWindow 启动 QThread 并等待来自网络的数据。当收到任何数据时更新 UI。
问题是:它有时会崩溃。有时不会,我所做的就是启动它并等待数据。
这是线程类:
class ListenerThread(QtCore.QThread):
def __init__(self,host,port,window):
super(ListenerThread,self).__init__(window)
self.host = host
self.port = port
self.window = window
def run(self):
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
soc.bind((self.host, self.port))
while True:
data, address = soc.recvfrom(9999)
print address
if data:
dataList = data.split("\\")
company = dataList[1]
projectName = dataList[2]
assets = dataList[3]
assetType = dataList[4]
assetName = dataList[5]
# parent here is the main window(the main thread) : updateCombo is a function that updates combo box inside the main window
self.parent().updateCombo(self.window.comboBoxCompany,company)
self.parent().updateCombo(self.window.dropDownProjects,projectName)
self.parent().select(assets,assetName)
为什么会发生这种情况?请记住,主窗口本身可以正常工作。
函数(updateCombo)也工作正常(当您从它的类调用它时)。
但是当我发送数据时主窗口不断崩溃!知道为什么吗?
GUI 小部件只能从主线程访问,这意味着调用的线程QApplication.exec()
。从任何其他线程访问 GUI 小部件 – 您正在通过调用执行什么操作self.parent()
– 是未定义的行为,在您的情况下这意味着崩溃。
您可以用信号和槽以安全的方式在后台线程和 GUI 之间进行通信。
请阅读有关 Qt 线程功能的文档,因为上述内容实际上是处理多线程 GUI 应用程序时的必备知识,不仅在 Qt 中,而且在任何其他 GUI 框架中也是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)