0

QT で Python アプリケーションの C++ ライブラリを使用しています。コールバックを使用して UI と通信します。私のライブラリは「ts」です。問題は、私のプログラムが時々クラッシュすることです。私が理解したように、emit() を呼び出すとクラッシュしますが、めったに起こりません。私のプログラムの簡略版は次のようになります。

import ts
...
class Parser(QObject):

    sig = Signal(ts.ProgramDescriptions)

    ts = ts.Ts()

    def init(self):
        self.ts.SetProgramChangeCB(SetProgramListCB)

    ...

class Ui_Dialog(QMainWindow):
    def __init__(self, pars):
        self.parser = pars
    ...

def SetProgramListCB(programDesc):
    print "SetProgramListCB"
    ui.parser.sig.emit(programDesc)



def SetProgramList(programDesc):
    print "SetProgramList"


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    Dialog = QDialog()

    parser = Parser()
    parser.init()
    parser.sig.connect(SetProgramList, Qt.QueuedConnection)

    parser.Start()

    ui = Ui_Dialog(parser)


    ...

ヘルプ!

4

1 に答える 1

0

クラッシュの原因が (phihag の助けを借りて) C++ の例外であることがわかった後、この方法でコードを変更し、問題を修正しました。

def SetProgramListCB(programDesc):        
    try:
        print ui.ravisParser.sig
        ui.ravisParser.sig.emit(programDesc)
    except:
        print "Error"

適切な作業の場合、私は持っています(出力):

<PySide.QtCore.Signal object at 0x01DD88C0>
<PySide.QtCore.Signal object at 0x01DD88C0>
<PySide.QtCore.Signal object at 0x01DD88C0>
...

エラーの場合:

Error
<PySide.QtCore.Signal object at 0x01DD88C0>
<PySide.QtCore.Signal object at 0x01DD88C0>
<PySide.QtCore.Signal object at 0x01DD88C0>
...

したがって、クラッシュした理由は、emit() シグナル 'sig' への最初の呼び出しで初期化されていなかったためです。接続信号 'sig' のに呼び出された 'parser.Start()' への呼び出し時に開始されるスレッドからコールバックが呼び出されるため、どのように発生するのか理解できません。

parser.sig.connect(SetProgramList, Qt.QueuedConnection)

parser.Start()
于 2011-09-30T08:37:49.413 に答える