Я создаю графический интерфейс для мониторинга данных с помощью PyQt4 и matplotlib для создания графиков. Графический интерфейс отображает несколько графиков одновременно (около 6 или 7). Чтобы дать потоку GUI больше времени и немного лучшее время отклика, я только рисую canvas.draw()
и все другие команды построения, которые я делаю в потоке, который обновляет данные графика. Поэтому в потоке, не связанном с графическим интерфейсом, я выполняю такие команды, как line.set_ydata
, ax.set_ylim
и другие, которые, возможно, потребуется обновить.
Два потока имеют доступ к объектам рисунка и холста через словарь, который передается двум потокам при инициализации. Когда поток не-GUI получает данные и обновляет график, он затем сигнализирует потоку GUI о перерисовке холста с использованием сигналов Qts (автоматическое подключение). Мой опыт работы с потоками говорит мне, что я должен использовать блокировку или убедиться, что не-GUI-поток каким-то образом заблокирован на перерисовке, но в моем порыве кодирования я никогда не вставлял его и не забывал об этом до сих пор. Ключевым моментом в этой ситуации является то, что я хочу видеть каждое обновление графика, а не перерисовывать в середине обновления другого потока или даже пропустить обновление (если это имеет смысл). В настоящее время я думаю, что мне просто повезло с выбором времени, и, кажется, все работает хорошо.
Еще одна полезная вещь - это то, что я создаю потоки, перемещая QObject в QThread с помощью moveToThread.
Мои вопросы:
- Мне просто везет или Qt просто делает что-то волшебное?
- Как лучше всего выполнить блокировку на холсте / фигуре matplotlib?
Вероятно, я должен отметить, что это была моя первая попытка сделать графический интерфейс более отзывчивым (перемещение команд matplotlib в поток данных), и я, возможно, перехожу к рисованному стилю анимации, который обновляет только изменяемые части графика. Но мне все еще интересно, как мне повезло.
Спасибо за любую помощь.
Обновление / Уточнение / Продолжение комментариев: Я хотел, чтобы вся система мониторов была легко изменена / обновлена учеными, которые могут быть знакомы только с matlab и, возможно, matplotlib. Я не полностью против перехода на pyqwt для построения графика скорости. А что касается кадров в секунду, мне вообще не нужно много, так как данные, которые наносятся на график, поступают только через каждые 0,5 секунды номинала (0,2 секунды как минимум). Кажется, что отзывчивость GUI "съедает **", потому что там очень много графиков. Я проверил концепцию взлома моего кода с помощью matplotlib blitting, и, кажется, это очень помогает, при необходимости произойдет pyqwt. Мои предыдущие вопросы остаются в силе.