我有一個PySide應用程序。在這個應用程序中,主函數運行在一個線程中(AnalysisThread
)。在這個線程中,我用Python記錄器記錄了一些東西。然後我添加一個自定義記錄器,它實際上是用一個字符串觸發一個信號。這個信號可以在主線程(GUI線程)中處理,但顯然插槽永遠不會觸發,但我確信信號self.messageWritten.emit
函數被調用(調試器確認這一點)。我究竟做錯了什麼 ?PySide中沒有處理的信號
class LogStream(QtCore.QObject):
messageWritten = QtCore.Signal(str)
signal_test = QtCore.Signal()
def write(self, msg):
if not self.signalsBlocked():
self.messageWritten.emit(msg)
class QtHandler(logging.Handler):
def __init__(self, stream):
logging.Handler.__init__(self)
self.stream = stream
def emit(self, record):
record = self.format(record)
if record:
self.stream.write('%s\n' % record)
class AnalysisThread(QtCore.QThread):
processing_ended = QtCore.Signal()
processing_failed = QtCore.Signal(Exception, list)
def __init__(self, analysis):
super(AnalysisThread, self).__init__()
self.analysis = analysis
def run(self):
try:
process = Process(target=self.analysis.analyze)
process.start()
process.join()
except Exception as err:
exec_info = sys.exc_info()
self.processing_failed.emit(err, exec_info)
finally:
self.processing_ended.emit()
class ProcessView(QtGui.QMainWindow):
def __init__(self):
super(ProcessView, self).__init__()
# Log Stream
self.stream = LogStream()
self.stream.messageWritten.connect(self.on_log_written)
def go(self):
analysis = MyAnalysis()
# Handler
handler = QtHandler(self.stream)
handler.setFormatter(logging.Formatter('(%(levelname)s-%(name)s) %(message)s'))
analysis.log.addHandler(handler)
self.processing = AnalysisThread(analysis)
self.processing.processing_ended.connect(self.on_processing_ended)
self.processing.processing_failed.connect(self.on_processing_failed)
self.processing.start()
def on_log_written(self, msg):
print('Message: {}'.format(msg)) # never called
編輯
爲了澄清,這是一個多線程的應用程序,而且還多進程一個...
根據文檔,QueuedConnection是多線程的默認行爲。但是,它不起作用,無論是DirectConnection。即使在執行結束時,也不會顯示日誌。 – GuillaumeA