Структура приложения с вычислениями в бесконечном цикле?
Допустим есть кнопка, ее задача запустить в функции бесконечный цикл, некие вычисления, которые должны выводиться в виде текста и графики (канвас). Каждое новое нажатие запускает вычисления с другими данными. Как это правильно делать? Создавать новый поток при каждом нажатии и проверять есть ли уже запущенный, выходить из него и после запускать новый? Или что-то передавать в поток (некую переменную) и постоянно проверять эти данные? Или использовать after, но тогда нужно где-то хранить данные вычислений, так как функция будет выполняться без цикла.
Как правильно реализовать? Как это называется? Какие есть практики? Что вообще искать?
Roman Kitaev, если цикл в потоке, можно использовать time.sleep(). Нет задачи рисовать слишком часто, 30 кадров/c хватит, или меньше, главное чтобы на глаз было нормально
Сергей, если у тебя нет изменений на канвасе — перерисовывать даже 30fps бесполезно. Погугли паттерн Observer.
Коротко так: твой рендерер подписывается на изменения фигур на канвасе и сидит на стуле ровно, пока изменений нет. Как только изменения есть — запускается рендер.
Но в этом случае может быть дикий fps в пиковых нагрузках, когда слишком много динамики. Для этого нужно в рендер-функции проверять, когда последний раз запускался рендер. И если он был не раньше, чем 1/30 секунд назад, то не перерисовывать, а добавлять в очередь на перерисовку. Этот тротлинг делать сложней, чем бесконечный цикл, но не факт, что даже нужно. Возможно достаточно просто перерисовывать мгновенно при получении каждого изменения.
Зато наблюдатель избавит тебя от бесконечного цикла и лишней траты cpu.
Однако, если элементов для отрисовки много (например, это экшн игра типа контр-страйка), то подписываться на изменения может быть очень затратно по памяти. Тогда бесконечный цикл может выиграть. Но только если фигур миллионы.