Почему слот моего Python QObject не запускается с помощью emit()

У меня есть код файловой системы python (watchdog), который успешно запускает вызов pyqtSignal#emit() из собственного потока (подтверждено трассировкой pdb).

Этот сигнал должен быть подключен через connect(...) к соответствующей функции @pyqtSlot в моем собственном QObject, но целевая функция на самом деле никогда не вызывается, когда изменение файловой системы вызывает выброс.

С кодом примера можно ознакомиться по адресу https://github.com/cefn/xmlorgmode/blob/2b97ff9994132def035d325fc7f7095c9fe187f2/index.py

и может быть вызван следующим образом: файл XML и файл XQuery передаются из одной и той же папки.

python index.py index.xml index.xq

Это отлично загружается в первый раз, но обновление никогда не происходит, поскольку оно запускается файловой системой, чего я и ожидал, если бы мой код работал. Неудача молчит.

Может ли кто-нибудь предложить дополнительные структуры цикла событий, которые мне нужны для запуска сторожевого таймера, чтобы соответствовать вызову QueryDisplay#update(...) ?

ФОН

Я экспериментировал с передачей динамически созданного HTML в QWebView, поддерживаемого текстовыми файлами в папке, которые время от времени меняются. Из-за требования, чтобы QWebView#setHtml(...) вызывался в своем собственном потоке, мне пришлось попытаться выяснить сигналы и слоты, и я наткнулся на кирпичную стену. Устройство потоков, к которому я пришел, каким-то образом нарушено, но я не могу понять, как это сделать.

Я не могу установить, как мой QObject должен быть связан с циклом событий в соответствующем потоке, чтобы можно было обрабатывать испускаемые вещи. После отладки работающего кода QApplication, QWebView и мой QObject совместно используют один и тот же поток при интерактивном вызове #thread() с pdb для установления сходства непосредственно перед входом в цикл app.exec_(). Я думал, что это будет означать, что все события для всех этих объектов будут обрабатываться в 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>

person cefn    schedule 10.12.2014    source источник


Ответы (1)


Это был PEBKAC, но по крайней мере с двумя интересными функциями взаимодействия. По сути, emit() действительно запускал слот, но все попытки, которые я предпринял для отслеживания запуска, были ошибочными.

Во-первых, PDB просто игнорирует точки останова, если они не возникают в основном потоке. Они никогда не запускаются, даже если эти строки кода действительно выполняются, если это происходит в другом потоке. Это очень плохие новости, но еще хуже то, что это тихий провал. Обходной путь состоит в том, чтобы вручную изменить код для вызова встроенной PDB, а не использовать оболочку отладчика, но это противоречит цели использования отладчика для исследования потока управления. По этой причине я не видел, чтобы вызов действительно происходил даже с установленной точкой останова.

Во-вторых, QXMLQuery молча игнорирует изменения в файлах и кэширует автоматически, поэтому, даже если он повторно вызывается и основные файлы «фокуса» действительно изменились, он игнорирует изменения. По этой причине я не мог видеть результаты инициированного взаимодействия (кеш предотвратил появление изменения).

person cefn    schedule 18.12.2014