2011-12-24 2 views
5

Пытается создать приложение таймера pomodoro в D. Так, чтобы использовать рубин, я хотел бы сделать основные сравнения времени.Сравнение времени в D

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

auto startTime = Clock.currTime(); 

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

do{ 

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

Однако пропавшие метод и ошибок типа вытекают. Есть идеи?

ответ

6

В дополнение к CyberShadow's answer, который действительно расскажет вам, как исправить ваш код, я хотел бы указать, что этот конкретный подход не самый лучший подход для таймера. Помимо того факта, что существует хорошая вероятность того, что переменная состояния будет иметь больше смысла (в зависимости от того, что вы действительно делаете), 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. Пока вам не нужно фактическое время суток и просто используйте это для целей синхронизации, тогда этот подход лучше.

+0

Спасибо, Джонатан. Я боролся с типами в D, когда я читал «Язык D» и стараюсь делать небольшие проекты, чтобы понять язык. Я никогда не делал C или C++; мой фон - Ruby и Perl с небольшим количеством Java. Следовательно, переход для меня не так естественен. Однако, с помощью gumption и помощи от хорошо осведомленных людей, таких как вы, я все же могу стать опытным! – RedMage

+2

Не стесняйтесь задавать любые вопросы, связанные с D, или в группах новостей D (в частности, D.learn). Мы здесь, чтобы помочь. – DejanLekic

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

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

+0

Благодарим за указание объема выпуска, CyberShadow. – RedMage

Смежные вопросы