0

QThreadを開始し、ネットワークからのデータを待機するQMainWindowがあります。データを受信するとUIを更新します。

問題は:時々クラッシュすることです。そして時々そうではありません、私がするすべては私がそれを始めてデータを待つことです。

これがスレッドクラスです:

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)も正常に機能しています(クラスから呼び出す場合)。

しかし、データを送信するとメインウィンドウがクラッシュし続けます!理由は何ですか?

4

1 に答える 1

3

GUIウィジェットには、メインスレッド、つまりを呼び出すスレッドからのみアクセスできますQApplication.exec()。他のスレッドからのGUIウィジェットへのアクセス(呼び出しで行っていることself.parent())は未定義の動作です。この場合、これはクラッシュを意味します。

安全な方法でバックグラウンドスレッドとGUIの間で通信するための信号とスロット。

また、Qtだけでなく、他のGUIフレームワークでもマルチスレッドGUIアプリケーションを処理する場合、上記は実際には不可欠な知識であるため、Qtのスレッド機能に関するドキュメントをお読みください。

于 2011-11-20T18:51:53.540 に答える