2014-12-10 9 views
0

파이썬 파일 시스템 (워치 독) 코드가 성공적으로 자신의 스레드에서 pyqtSignal # emit() 호출을 트리거합니다 (pdb 추적으로 입증 됨).python QObject의 슬롯이 emit()에 의해 트리거되지 않는 이유

이 신호는 connect (...)를 통해 내 자신의 QObject의 해당 @pyqtSlot 함수에 연결해야하지만 파일 시스템 변경시 방출 대상을 트리거 할 때 대상 함수는 실제로 호출되지 않습니다.

예제 코드

https://github.com/cefn/xmlorgmode/blob/2b97ff9994132def035d325fc7f7095c9fe187f2/index.py

에서 검사 될 수 있고, 다음과 같이 XML 파일과 동일한 폴더에 전달 된 XQuery에 파일과, 호출 될 수있다.

python index.py index.xml index.xq 

처음에는 완벽하게로드되지만 파일 시스템에 의해 새로 고침이 발생하지 않습니다. 이것은 코드가 작동하면 기대했던 것입니다. 실패는 침묵이다.

WatchDog 트리거 에미 션이 QueryDisplay # update (...)에 대한 호출에 해당하도록 추가 이벤트 루프 구조를 제안 할 수 있습니까?

배경

내가 동적 HTML 구성 지나가는 실험을했습니다 때때로 변경 폴더에 텍스트 파일로 백업 QWebView합니다. QWebView # setHtml (...)이 자체 스레드 내에서 호출되어야한다는 요구 사항 때문에 신호와 슬롯을 찾아야하고 벽돌 벽에 부딪 혔습니다. 내가 도착한 스레딩 배열은 어찌 되었든 깨졌지만 방법을 알 수는 없습니다.

방출 된 사항이 처리 될 수 있도록 QObject가 해당 스레드 내의 이벤트 루프와 연관되는 방식을 설정할 수 없습니다. 실행중인 코드를 디버깅 한 후 QApplication, QWebView 및 QObject는 app.exec_() 루프를 입력하기 직전에 #thread()를 pdb와 대화식으로 호출하여 유사성을 설정할 때 동일한 스레드를 공유합니다. 이 모든 객체에 대한 모든 이벤트가 app.exec_() 내에서 처리된다는 것을 의미한다고 생각했지만 어떻게 든 모델을 오해 했음에 틀림 없습니다.

(Pdb) adaptor.thread() 
<PyQt4.QtCore.QThread object at 0xb30c3c44> 
(Pdb) display.view.thread() 
<PyQt4.QtCore.QThread object at 0xb30c3c44> 
(Pdb) app.thread() 
<PyQt4.QtCore.QThread object at 0xb30c3c44> 

답변

0

이것은 PEBKAC이지만 두 가지 이상의 흥미로운 기능 상호 작용이 있습니다. 본질적으로 emit()가 실제로 슬롯을 트리거했지만 트리거를 모니터링하기 위해 시도한 모든 시도에는 결함이있었습니다.

우선 주 스레드에서 PDB가 발생하지 않으면 PDB는 중단 점을 무시합니다. 코드 행이 실제로 실행 되더라도 다른 스레드에서 발생하더라도 트리거되지 않습니다. 이것은 매우 나쁜 소식이지만, 더 나쁜 것은 침묵의 실패입니다. 해결 방법은 디버거 셸을 사용하는 대신 PDB를 인라인으로 호출하도록 코드를 수동으로 변경하는 것이지만 디버거가 제어 흐름을 조사하는 목적을 상쇄하는 것입니다. 이런 이유로 나는 breakpoint가있는 곳에서도 실제로 호출을 보지 못했다.

둘째, QXMLQuery는 자동으로 파일과 캐시의 변경 사항을 무시하므로 재 호출되고 기본 '포커스'파일이 실제로 변경된 경우에도 변경 내용은 무시됩니다. 이러한 이유로 나는 상호 작용의 결과가 트리거되는 것을 보지 못했습니다 (캐시가 변경을 막았습니다).