Приложение PYQTGraph замедляется, когда мышь перемещается по приложению

У меня есть многопоточное (через pyqt) приложение, которое отображает данные в реальном времени (данные обрабатываются во втором потоке и передаются в поток графического интерфейса для построения через pyqt-сигнал). Если я наведу указатель мыши на приложение, оно продолжит работать на полной скорости (измеряется разницей во времени между вызовами app.processEvents()). Как только я начинаю двигать мышь, скорость обновления замедляется до минимума и снова увеличивается, когда я перестаю двигать мышью.

Кто-нибудь знает, как я могу решить эту проблему/отладить проблему?

Код довольно длинный и сложный, поэтому я бы не стал публиковать его здесь. Спасибо!


person mor22    schedule 09.05.2014    source источник
comment
Это может показаться очевидным, но проверяли ли вы активные обработчики событий mouseMoveEvent?   -  person ChristopheD    schedule 09.05.2014
comment
Я явно не определил. Как мне найти какие-либо значения по умолчанию?   -  person mor22    schedule 09.05.2014
comment
Я думаю, было бы неплохо увидеть ваш код. Вызов processEvents в вашем коде не идеален, так что это может быть частью вашей проблемы.   -  person three_pineapples    schedule 10.05.2014


Ответы (1)


Вероятно, у вас есть элементы в сцене, которые принимают ввод с помощью мыши, но трудно сказать, не видя кода. В частности, будьте осторожны со сложными сюжетными линиями, которые сделаны кликабельными — очень дорого вычислять пересечение курсора мыши с такими сложными формами.

Лучший (некоторые сказали бы только) способ решить проблемы с производительностью — это профилировать ваше приложение: запустить python -m cProfile -s cumulative your_script.py один раз, не перемещая мышь, и еще раз с движением мыши (убедитесь, что вы потратили много времени на перемещение мыши), а затем сравните результаты. чтобы увидеть, где переводчик проводит все свое время.

person Luke    schedule 09.05.2014
comment
Спасибо, я вижу вызов mouseMoveEvent из GraphicsView.py и GraphicsScene.py в профилированном коде (3-й и 4-й в кумулятивном профиле после ‹module› и {встроенного метода exec_}. У меня есть объект GraphicsLayoutWidget, использующий addPlot для создайте графики.Я не могу сразу увидеть, что вызывает mouseMoveEvent. - person mor22; 15.05.2014
comment
Составляя упрощенный код моего скрипта Python для демонстрации проблемы, я обнаружил, что она была вызвана вызовом второго потока данных run(). Я понятия не имею, почему это замедляло работу всей программы при перемещении мыши или почему она запускала mouseMoveEvent. Я все равно опубликую код слизи ниже - person mor22; 22.05.2014
comment
Мы должны найти другое место для обсуждения этого кода, но я дам пару советов: 1) Ваш поток потребляет много ресурсов ЦП и постоянно зависает GIL. Вы должны ожидать, что в этом случае производительность ухудшится. 2) То, что код определен как метод QThread, не означает, что код должен выполняться в другом потоке. В вашем случае второй поток ничего не делает, кроме как тратит циклы ЦП - генерация данных фактически происходит в основном потоке. - person Luke; 24.05.2014
comment
Спасибо, что нашли время, чтобы посмотреть на это; Я перешел от определения QThread к структуре кода QObject, moveToThread. - person mor22; 29.05.2014