Приложение Python аварийно завершает работу при генерации сигнала от обратного вызова - PullRequest
0 голосов
/ 28 сентября 2011

Я использую мою библиотеку c ++ из приложения Python с QT. Он использует обратный вызов для связи с пользовательским интерфейсом. Моя библиотека это "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 голосов
/ 30 сентября 2011

Узнав, что причиной сбоя является исключение C ++ (с помощью phihag), я изменил свой код таким образом, и это устранило проблему:

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

В случае правильной работы яhave (output):

<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()
...