Как отследить ошибку с PyGTK3, которая замораживает пользовательский интерфейс? - PullRequest
0 голосов
/ 07 февраля 2019

Я использую PyGTK3 [python3.7, Debian 9.7 @ x86_64, Gtk 3.22.11] для встроенного интерфейса [X11, Xfce4, режим киоска].

Я заметил, что через некоторое времяПользовательский интерфейс "зависает": элементы пользовательского интерфейса больше не перерисовываются, независимо от того, какие вызовы Gtk вызываются.

Сначала я думал, что основной цикл по какой-то причине завис, но это определенно не так: выполнение продолжается, потоки приложения и поток пользовательского интерфейса продолжают регистрировать трассировки.Я также добавил таймер (GLib.timeout_add), который продолжает вызываться в определенном темпе.

Я дважды проверил, что все вызовы, сделанные из потоков приложения в цикл Gtk, напрямую проходят через GLib.idle_add;все события, полученные от Gtk, помещаются в очередь событий, которой управляет поток приложения, чтобы избежать любых длинных вызовов, которые могут быть сделаны из основного контекста.

Любая подсказка о том, как отладить проблему такого рода, будет принята с благодарностью.У меня нет идей.GDB доступна на тестовой платформе, хотя я не знаю, как отследить эту проблему.

Дополнительные сведения об этой проблеме:

Элементы пользовательского интерфейса включают несколько текстовых меток, индикатор выполнения.и две основные области рисования, содержащиеся на странице записной книжки.Приложение работает в полноэкранном режиме [800x480].

Я запускаю приложение в каком-то режиме автоматического тестирования, чтобы снова и снова запускать одну и ту же последовательность, пока она не замерзнет, ​​без какого-либо ввода данных пользователем - ни какихсобытие ввода.

При зависании приложение не падает, процессоры не показывают заметной нагрузки при зависании интерфейса.

Интерфейс «зависает» случайным образом, от 5 до 100 циклов.Каждый цикл длится ~ 4 секунды.Цикл делает менее ста обращений к Gtk API.

Интерфейс пользователя предоставляет модальное диалоговое окно для выхода из приложения, которое можно активировать из строки главного меню.Когда пользовательский интерфейс заморожен, например, многие вызовы для изменения содержимого текстовой метки, значения доли индикатора выполнения и т. Д. Не обслуживались, тем не менее появляется диалоговое окно.Иногда его содержимое отображается успешно, иногда отображается только диалоговое окно (включая кнопки) вместе с текстом заголовка, в то время как область содержимого диалогового окна не перерисовывается ...

Что может вызвать этокакие-то проблемы, когда пользовательский интерфейс больше не обновляется, но основной контекст, кажется, запущен?

...