Главное окно pyqt продолжает падать после получения данных из потока - PullRequest
0 голосов
/ 20 ноября 2011

У меня есть 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 голосов
/ 20 ноября 2011

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

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

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

...