2011-12-24 20 views
5

Tentativo di creare un'app di timer pomodoro in D. Così abituato a rubare, vorrei fare dei confronti temporali di base.Confronto tempi in D

Ho provato ad utilizzare qualcosa come

auto startTime = Clock.currTime(); 

e poi confrontando afferrando l'ora corrente e il confronto:

do{ 

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

Tuttavia, il metodo mancanti e errori di tipo derivarne. Qualche idea?

risposta

6

Oltre a CyberShadow's answer, che in effetti ti dice come correggere il codice, vorrei sottolineare che questo particolare approccio non è l'approccio migliore per un timer. A parte il fatto che ci sono buone probabilità che una variabile di condizione abbia più senso (a seconda di quello che stai facendo davvero), Clock.currTime è la funzione sbagliata da utilizzare.

Clock.currTime restituisce l'ora utilizzando l'orologio in tempo reale, mentre il tempo sarà generalmente più accurato con un orologio monotono. Con orologi diversi da un orologio monotono, il tempo può essere influenzato dalle modifiche all'orologio (ad esempio, l'orologio di sistema viene regolato da alcuni minuti dal daemon NTP). Tuttavia, un orologio monotono si sposta sempre in avanti alla stessa velocità, anche se l'orologio di sistema è regolato. Quindi, non è molto utile per ottenere il tempo, ma è perfetto per le cose di temporizzazione. Per questo, che ci si vuole fare qualcosa di più simile a questo:

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

Così, si finisce per trattare con core.time.TickDuration invece di std.datetime.SysTime. Finché non è necessario l'orario attuale e lo si utilizza solo per scopi di tempistica, allora questo approccio è migliore.

+0

Grazie, Jonathan. Ho lottato con i tipi in D mentre leggevo "The D Language" e provavo a fare piccoli progetti per ottenere una comprensione della lingua. Non ho mai fatto C o C++; il mio background è Ruby e Perl con una piccola quantità di Java. Quindi, la transizione non è così naturale per me. Tuttavia, con un po 'di comprensione e un aiuto da parte di persone esperte come te, posso ancora diventare esperto! – RedMage

+2

Non essere timido nel fare domande o domande relative alla D qui, o nei newsgroup D (in particolare D.learn). Siamo qui per aiutare. – DejanLekic

4
  1. ti manca un )
  2. variabili dichiarate all'interno di un ambito while non sono visibili alla condizione while - è necessario spostare la dichiarazione nowTime al di fuori del blocco do ... while.
  3. Deve essere dur!"minutes", non "minute".

Con queste correzioni, il codice si compila bene per me.

+0

Grazie per aver segnalato il problema dell'ambito, CyberShadow. – RedMage