2011-09-28 71 views
0

我使用QT從python應用程序中使用我的C++庫。它使用回調與UI進行通信。 我的圖書館是'ts'。問題是我的程序有時會崩潰。 據我瞭解,它調用emit()時崩潰,但它很少發生。 我的程序的簡化版本如下所示:Python應用程序在從回調信號中發出信號時崩潰

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) 


    ... 

幫助!

+0

這僅僅是周圍的GUI代碼,這是不太可能產生崩潰。這聽起來很像是你的圖書館或'ui.ravisParser.sig.emit'中的問題。您應該在調試器下運行程序以獲取有關崩潰的詳細信息 - 它是什麼直接原因(例如,在無效地址上讀取內存 - 哪一個?)? – phihag

+0

對不起,我是inattantive,並在發佈源代碼時犯了一些錯誤。現在我糾正了它。 我是新手在Python中,所以我不知道如何在調試器下運行我的應用程序。你能推薦我調試器嗎?我的操作系統是Win7。 –

+0

這個編輯稍微澄清一些,但問題仍然只包含GUI代碼,而不是'parser'中的那個,這可能是錯誤的。任何調試器都會執行,例如[WinDbg](http://msdn.microsoft.com/en-us/windows/hardware/gg463009)。 – phihag

回答

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

那麼,爲什麼它墜毀的原因呈丁第一次調用發出()信號'sig'的帽子沒有初始化。 我不明白怎麼會發生,因爲回調是從哪個線程開始調用時調用「parser.Start()」,這後調用連接信號「SIG的」:

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

parser.Start() 
相關問題