Поставить таймер на паузу

Здраствуйте, я использую модуль Timers. Таймер срабатывает через определенные отрезки времени. Если остановить и запустить таймер, то отсчет начнется сначала. А каким образом можно поставить таймер на паузу?

Ну наверно самое легкое как-то отслеживать время прошедшие с начала запуска таймера и потом его использовать. А есть ли какой-то более правильный способ?

Возможно даже как-то добавить объекту timer метод Pause()

  1. Модуль Timers - огрызок на 100 строк. Используйте тип System.Timers.Timer напрямую.

  2. Вы плохо описали, но если я правильно понял - такого функционала нет и в оригинальном типе. Подробно объясните зачем вам - тогда я подобрать альтернативы.

У меня в игре через определённые моменты времени происходят действия. И вот решил я добавить в игру возможность ставить на паузу. Нужно как-то сделать что-бы таймер так-же ставился на паузу. А если этого не делать, то если очен быстро ставить на паузу, то получается, что действие вообще может не выполняться. (Понятно, что так-то часто ставить на паузу нет смысла, но нужно сделать нормально игру). Наверно щас видос сниму покажу вам программу

По таймеру блоки перемещаются вниз и едут по экрану. Но вот, когда ставишь игру на паузу, таймер сбрасывается и так можно сделать,что блоки вобще не появляются. Если надо скину код программы.

Это говнокод. Надо отсчитывать итерации физического движка перед созданием препятствия, а на паузу ставит сам поток физики.

1 лайк

А ну то есть вести что-ли счетчик, который при каждом 50-том срабатывании функции ,ответственной за перерисовку графики, будет вызывать функцию которая будет переставлять вот эти прямоугольники?

Ну, можно и в потоке графики, раз у вас нет нормального разделения на поток графики, ввода и физики… Я вообще потыкался в GraphWPF - сделать нормальный поток обработки ввода без рефлекции и не получится. Ну и в принципе для простенькой игры как у вас - это лишнее, пока сойдёт и так…

Нет ну смотрите если так общем случае, то как мне объединить поток графики и ввода? (графика и физика тут вместе). Каждую итерацию проверять какие клавиши нажаты?

Идея не оч хорошая, операции обычно надо наоборот стараться разделять на несколько потоков, потому что 1-ядерные процессоры уже нереально встретить (если не считать компы в школах), не говоря уже про графические процессоры. Вообще не все операции можно разделить на несколько потоков и потом эффективно синхронизировать, но если делать через 3 потока: графики, физики и ввода - по моему опыту получается лучше всего.

Но если так уж хотите, чтоб в данном случае хоть как то собрать - могу порекомендовать WinAPI функцию GetKeyState. Пример можно найти тут:

Большую часть всего можно убрать, главное вывод состояний клавишь с номерами от 0 до 255. Я таким образом узнаю id клавиш за которым надо следить в своих программах.

Только имейте в виду что синхронизации с ним вообще 0. Между 2 вызовами GetKeyState клавиша может быть нажата/отжата. Поэтому на 1 итерации вывода старайтесь не допускать 2 вызовов GetKeyState для 1 и той же клавиши. Если надо инфу в 2 местах - сохраняйте результат в переменную.

А я немного не правильно понял, то есть лучше сделать что-бы было в разных потоках все. Тогда ладно, вообще да надо поток ввода сделать более правильно, просто вроде и так работает поэтому не занимался этим)

Проблема GetKeyState, почему я сказал что сделать нормальный отдельный поток ввода без рефлекции не выйдет - GetKeyState даже когда окно свёрнуто. В своих программах я сам занимаюсь созданием окна. Поэтому я могу ручками проверять когда оно свёрнуто в потоке ввода. Но в GraphWPF, вроде, нет ничего чтоб проверить - свёрнуто ли окно.

Проще всего сделать так: при некотором условии некоторая глобальная переменная получает значение Paused := True и в обработчике таймера ставите

if Paused then 
  exit;

Решение, предлагаемое выше, оно для профессионалов.