Ускорение Timer.periodi c, пока он еще работает - PullRequest
0 голосов
/ 07 февраля 2020

Я новичок в программировании и трепетании, и я только что застрял с этим.

Я хочу построить метроном, который может ускоряться с фиксированными интервалами. Например, каждые 5 секунд таймер ускоряется на 10 ударов в минуту.

Я кодировал основной метроном c, используя Timer.periodic; Теперь я подумал, что использование нового Timer.periodi c для ускорения предыдущего таймера каждые 5 секунд может работать, и на самом деле я не знаю, работает ли он.

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

1 Ответ

0 голосов
/ 07 февраля 2020

Нет способа изменить интервал Timer во время его работы, поэтому единственный способ - запустить новый с измененным интервалом, как вы делаете.

Однако, могу ли я предложить альтернативное решение, где вместо отмены предыдущего таймера вы ждете его завершения, прежде чем запустить новый. Это устранило бы образовавшуюся «пропасть». (Интересно, что управление с Timer.periodic может быть немного раздражающим, поэтому вы можете попробовать использовать простой Timer.)

class Metronome {
  double tempo;
  bool active = false;

  Metronome([this.tempo = 60.0]);

  void start() {
    active = true;
    Timer(_getDuration(), _handleEvent);
  }

  void stop() {
    active = false;
  }

  void _handleEvent() {
    // TODO: Handle metronome event, e.g. make the tick sound

    if (active) {
      Timer(_getDuration(), _handleEvent);
    }
  }

  Duration _getDuration() {
    final time = 1 / tempo;
    return Duration(
      seconds: time.toInt(),
      milliseconds: (time * 1000).toInt() % 1000,
      microSeconds: (time * 1000000).toInt() % 1000,
    );
  }
}
...