Python 应用在回调中发出信号时崩溃
我在用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()