pyqt main window keeps crashing after receiving da

2019-09-02 15:25发布

问题:

i have a QMainWindow that starts a QThread and waits for data from the network. updates UI when it receive any data.

the problem is : it sometimes crash. and sometimes doesn't , all i do i start it and wait for data.

here is the thread class :

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)

why is this happening ?? put in mind that the main Window by itself works fine.

the function (updateCombo) is working fine also ( when you call it from it's class).

but main window keeps crashing when i send data ! any idea why ?

回答1:

GUI widgets may be accessed only from main thread, meaning the thread that calls QApplication.exec(). Access to GUI widgets from any other thread – what you're doing with your calls to self.parent() – is undefined behaviour, in your case this means crashes.

You signals and slots to communicate between background threads and the GUI in a safe manner.

And please read the documentation about Qt's threading functionality, because the above is actually essential knowledge when dealing with multi-threaded GUI applications, not only in Qt, but in any other GUI framework, too.