pyqt主窗口在接收线程数据后不断崩溃

0 投票
1 回答
2184 浏览
提问于 2025-04-17 06:42

我有一个QMainWindow(主窗口),它会启动一个QThread(线程),然后等待网络数据。当收到数据时,它会更新界面。

问题是:它有时候会崩溃,有时候又不会。我只是在启动它并等待数据。

这是线程的代码:

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)也能正常工作(当你从它的类中调用时)。

但是每当我发送数据时,主窗口就会崩溃!你知道为什么吗?

1 个回答

3

GUI小部件只能从主线程访问,也就是调用QApplication.exec()的那个线程。如果你从其他线程访问GUI小部件,比如你调用self.parent(),这就会导致不确定的行为,简单来说就是可能会崩溃。

你可以使用信号和槽来安全地在后台线程和GUI之间进行通信。

另外,请阅读关于Qt线程功能的文档,因为这些知识在处理多线程的GUI应用时非常重要,不仅在Qt中,在其他任何GUI框架中也是如此。

撰写回答