Главное окно pyqt продолжает падать после получения данных из потока

у меня есть 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) также работает нормально (когда вы вызываете ее из своего класса).

но главное окно продолжает падать, когда я отправляю данные! Любая идея, почему?


person Moayyad Yaghi    schedule 20.11.2011    source источник


Ответы (1)


Доступ к виджетам GUI возможен только из основного потока, то есть из потока, вызывающего QApplication.exec(). Доступ к виджетам графического интерфейса из любого другого потока — то, что вы делаете со своими вызовами self.parent() — поведение undefined, в вашем случае это означает сбой.

Вы сигнализируете и слоты для безопасной связи между фоновыми потоками и графическим интерфейсом.

И, пожалуйста, прочтите документацию о функциях многопоточности Qt, потому что вышеизложенное на самом деле является важным знанием при работе с многопоточными приложениями с графическим интерфейсом, не только в Qt, но и в любой другой среде графического интерфейса.

person lunaryorn    schedule 20.11.2011
comment
сейчас работает нормально. ты прав . я никогда не должен использовать self.parent(), сигналы - это ключ, хорошая работа! - person Moayyad Yaghi; 23.11.2011