0

我将 python 应用程序中的 c++ 库与 QT 一起使用。它使用回调与 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

在发现崩溃的原因是 C++ 异常(在 phihag 的帮助下)后,我以这种方式更改了代码,并解决了问题:

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 回答