2011-12-24 10 views
5

Intentando construir una aplicación de temporizador pomodoro en D. Así que, acostumbrado a ruby, me gustaría hacer comparaciones de tiempo básicas.Comparación de tiempo en D

He intentado utilizar algo así como

auto startTime = Clock.currTime(); 

y luego comparar por el acaparamiento de la hora actual y comparando:

do{ 

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

Sin embargo, el método que faltan y errores de tipo sobrevienen. ¿Algunas ideas?

Respuesta

6

Además de CyberShadow's answer que realmente le dice cómo arreglar su código, me gustaría señalar que este enfoque particular no es el mejor enfoque para un temporizador. Además del hecho de que hay una buena probabilidad de que una variable de condición tenga más sentido (dependiendo de lo que realmente esté haciendo), Clock.currTime es la función incorrecta que se debe usar.

Clock.currTime devuelve el tiempo utilizando el reloj de tiempo real, mientras que el tiempo en general será más preciso con un reloj monotónico. Con relojes que no sean un reloj monotónico, el tiempo puede verse afectado por los cambios en el reloj (por ejemplo, el daemon NTP ajusta el reloj del sistema en unos pocos minutos). Sin embargo, un reloj monotónico siempre avanza a la misma velocidad, incluso si el reloj del sistema está ajustado. Por lo tanto, no es muy útil para obtener el tiempo, pero es perfecto para cronometrar cosas. Para ello, te gustaría hacer algo más como esto:

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

Así, se termina tratar con core.time.TickDuration en lugar de std.datetime.SysTime. Siempre que no necesite la hora del día real y solo esté usando esto para el tiempo, entonces este enfoque es mejor.

+0

Gracias, Jonathan. He estado luchando con los tipos en D mientras leo en "The D Language" y trato de hacer pequeños proyectos para comprender el idioma. Nunca hice C o C++; mi experiencia es Ruby y Perl con una pequeña cantidad de Java. Por lo tanto, la transición no es tan natural para mí. Sin embargo, con valor y la ayuda de gente conocedora como usted, ¡aún puedo ser competente! – RedMage

+2

No sea tímido para hacer preguntas relacionadas con D aquí, o en grupos de noticias D (D.learn en particular). Estamos aquí para ayudar. – DejanLekic

4
  1. te falta un )
  2. Las variables declaradas dentro de un alcance while no son visibles a la condición while - tiene que mover la declaración nowTime exterior del bloque do ... while.
  3. Debe ser dur!"minutes", no "minute".

Con estas correcciones, el código compila bien para mí.

+0

Gracias por señalar el problema del alcance, CyberShadow. – RedMage