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