2011-11-20 42 views
0

我有一个QMainWindow启动QThread并等待来自网络的数据。在接收任何数据时更新UI。pyqt主窗口从线程接收数据后不断崩溃

问题是:它有时会崩溃。有时候不会,我只要开始它并等待数据。

这里是线程类:

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

但我发送数据时主窗口不断崩溃!任何想法为什么?

回答

3

GUI小部件只能从主线程访问,这意味着调用QApplication.exec()的线程。从任何其他线程访问GUI小部件 - 您对self.parent()的调用进行的操作 - 未定义行为,在您的情况下,这意味着崩溃。

您用信号和插槽以安全的方式在后台线程和GUI之间进行通信。

并请阅读Qt的线程功能的文档,因为上面实际上是多线程的GUI应用程序,不仅在Qt的,但在任何其他GUI框架打交道时,也基本知识。

+0

现在工作正常。你是对的 。我不应该使用self.parent(),信号是关键,好工作! –