Сравнение времени в D - PullRequest
       19

Сравнение времени в D

5 голосов
/ 24 декабря 2011

Я пытаюсь создать приложение таймера Pomodoro в D. Я использовал ruby, и я хотел бы сделать базовые сравнения времени.

Я пытался использовать что-то вроде

auto startTime = Clock.currTime();

, а затем сравнивать, захватывая текущее время и сравнивая:

do{

// bla bla stuff
  auto nowTime = Clock.currTime();
}while(nowTime <= (startTime + dur!"minute"(25));

Тем не менее, отсутствуют ошибки метода и типа.Есть идеи?

Ответы [ 2 ]

6 голосов
/ 24 декабря 2011

В дополнение к ответу CyberShadow , который действительно говорит вам, как исправить ваш код, я хотел бы отметить, что этот конкретный подход не является лучшим подходом для таймера.Помимо вероятности того, что условная переменная будет иметь больше смысла (в зависимости от того, что вы на самом деле делаете), Clock.currTime - это неправильная используемая функция.

Clock.currTime возвращаетвремя с использованием часов реального времени, в то время как время будет обычно более точным с монотонными часами.В случае часов, отличных от монотонных, время может зависеть от изменений часов (например, системные часы настраиваются демоном NTP на несколько минут).Однако монотонные часы всегда движутся вперед с одинаковой частотой, даже если системные часы настроены.Таким образом, это не очень полезно для получения времени, но идеально подходит для определения времени.Для этого вы хотели бы сделать что-то более похожее на это:

auto endTime = Clock.currSystemTick + to!TickDuration(dur!"minutes"(25));
do
{
    //bla bla stuff
} while(Clock.currSystemTick < endTime);

Итак, вы в конечном итоге имеете дело с core.time.TickDuration вместо std.datetime.SysTime.Если вам не нужно фактическое время суток и вы используете его только в целях определения времени, тогда такой подход лучше.

4 голосов
/ 24 декабря 2011
  1. Вам не хватает )
  2. Переменные, объявленные в области действия while, не видны для условия while - необходимо переместить объявление nowTime за пределыdo ... while block.
  3. Это должно быть dur!"minutes", а не "minute".

С этими исправлениями код компилируется для меня нормально.

...