2016-02-29 2 views
2

Je peux mesurer le temps à l'aide:std :: :: system_clock et Chronos durée <double>

t1 = system_clock::now(); 
... 
t2 = system_clock::now(); 

duration<double> d = t2 - t1; 

qui compile très bien, mais comment puis-je faire l'inverse? Je veux déplacer un point de temps en utilisant la durée?

exemple (ne compile pas):

system_clock::time_point tp1 = system_clock::now(); 
system_clock::time_point tp2 = tp1 + duration<double>(1.0); 

Le system_clock::time_point '+' opérateur ne semble pas accepter duration<double>.

Comment puis-je déplacer un point de temps d'une durée spécifiée en secondes (valeur à virgule flottante)? Je dois utiliser system_clock car il peut convertir en time_t.

+0

Convertir la durée en une version entière (par exemple std :: chrono :: microseconds)? – MikeMB

+0

@MikeMB Pouvez-vous s'il vous plaît poster un exemple de comment faire cela? Dois-je convertir la valeur float à la durée en utilisant 'duration :: period'? –

+0

José l'a déjà fait. – MikeMB

Répondre

1

Ok, je suis allé avec les éléments suivants (voir que VS2012 pourrait avoir un bug dans 'duration_cast'). Pour ajouter une durée spécifiée en secondes (en utilisant à virgule flottante) à un point de temps system_clock:

const double SECS_TO_SYSTEM_TICKS = (double)system_clock::period::den/(double)system_clock::period::num; 
system_clock::time_point tp1 = system_clock::now() 
double dTimeS = 1.0; 

... 

system_clock::duration d((system_clock::rep)(floor(dTimeS) * SECS_TO_SYSTEM_TICKS)); 
time_t t = system_clock::to_time_t(t1 + d); 

J'utilise « étage (dTimeS) » juste parce que dans ma mise en œuvre, je ne veux pas que les fractions de secondes à raflés en secondes.

Les éléments suivants doivent également travailler sur un compilateur plus récent (selon la réponse de José):

system_clock::duration d = duration_cast<system_clock::duration>(duration<double>(floor(dTimeS))); 
time_t t = system_clock::to_time_t(t1 + d); 

Cela a également travaillé pour moi:

auto secs = seconds((seconds::rep)floor(dTimeS)); 
auto system_ticks = duration_cast<system_clock::duration>(secs); 
time_t t = system_clock::to_time_t(t1 + system_ticks); 

NOTE: Le comportement d'arrondi (tiques à quelques secondes) de 'to_time_t' n'est pas spécifié et si j'ai besoin des secondes fractionnées je l'extrait séparément.

3

Est-ce ce que vous cherchez?

system_clock::time_point tp1 = system_clock::now(); 
system_clock::time_point tp2 = tp1 + duration_cast<system_clock::duration>(duration<double>(1.5)); 
cout << duration_cast<milliseconds>(tp2 - tp1).count(); 

sortie: différence est 1500ms

Live Demo

+2

Notez que 'microseconds' n'est pas garanti pour être le type correct pour' system_clock'. Vous devriez lancer 'system_clock :: duration' – user2079303

+0

Mon compilateur n'accepte pas 'std :: chrono :: duration_cast (std :: chrono :: durée (1.5))' . erreur: '': impossible de convertir '_CR' en 'std :: chrono :: system_clock :: duration'. J'utilise VS2012 –

+0

C'est parce qu'il y a un bug dans VS 2012. –