artemgapchenko
@artemgapchenko

Как организовать запуск/остановку функции отрисовки виджета?

Возможно, проблема покажется очень простой. Я, правда, застрял на ней и вот уже второй день пытаюсь что-то придумать.
Пишу приложение на PySide. Задача, если локализовать её проблемное место, выглядит так: по нажатию на кнопку «Play» (свойство checkable выставлено в True) запускается некая функция, которая в цикле проводит расчеты и раз в сто миллисекунд обновляет с помощью QPainter'a изображение клеточного автомата (что это такое, в принципе, тоже не важно). По второму нажатию на «Play» эта функция прекращает свою работу.
Если с первой частью задачи вопросов никаких нет — соединяем слот checked нашей кнопки с определенным нами же сигналом (назовем его on_play), который запускает главный цикл, то что делать со второй частью, непонятно.
Проблема в том, что после того, как наш сигнал on_play запускается в первый раз, работать он может бесконечно. Следовательно, даже не смотря на то, что мы пытаемся нажать на кнопку «Play» и изменить тем самым её состояние checked на False (в on_play можно выставить проверку на то, является ли в данный момент кнопка зажатой или нет, и в зависимости от этого, продолжать или прекращать вычисления), сделать мы этого не можем — предыдущий запуск сигнала еще не закончил свое выполнение. Взаимоблокировка.
Я правильно понимаю, что исправить эту проблему можно только с помощью параллельного программирования? Запустить, скажем, on_play в отдельном потоке, а работу со сменой состояний кнопки осуществлять в самом приложении. Или же можно обойтись без него?
  • Вопрос задан
  • 2958 просмотров
Решения вопроса 2
@alz
Таймеры используйте
Ответ написан
Riateche
@Riateche
В процессе выполнения длительной функции периодически вызывайте QApplication::processEvents(). Тогда интерфейс не будет «зависать». После вызова этой функции проверяйте, нажата ли кнопка, и прерывайте цикл, если надо. Можно и через потоки решить эту проблему, но если можно обойтись без них, лучше обойтись.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ixSci
@ixSci
А зачем обходиться без него? play должен выполняться асинхронно, а значит нечего тут думать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы