Python 应用在回调中发出信号时崩溃

0 投票
1 回答
632 浏览
提问于 2025-04-17 03:15

我在用QT的Python应用程序中使用我的C++库。这个库通过回调函数和用户界面进行沟通。我的库叫做'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)


    ...

求助!

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'没有被初始化。我不明白为什么会这样,因为回调是在一个线程中调用的,这个线程是在调用'parser.Start()'后启动的,而这个调用是在连接信号'sig'之后进行的:

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

parser.Start()

撰写回答