2009-11-14 15 views
9

Estoy escribiendo un programa que se utilizará en una máquina Solaris. Necesito una forma de hacer un seguimiento de cuántos segundos han pasado desde el inicio del programa. Estoy hablando muy simple aquí. Por ejemplo, tendría un int segundos = 0; pero ¿cómo voy a actualizar la variable de segundos a medida que pasa cada segundo?C++ Hacer un seguimiento de cuántos segundos han pasado desde el inicio del programa

Parece que algunas de las diversas funciones de tiempo que he visto solo funcionan en máquinas con Windows, así que no estoy seguro.

Cualquier sugerencia sería apreciada.

Gracias por su tiempo.

+0

¿Necesita un evento cada segundo? actualizar algo? o solo el total de segundos que el programa se ejecuta? – Dani

Respuesta

0

Solo necesita almacenar la fecha/hora cuando comenzó la aplicación. Siempre que necesite mostrar durante cuánto tiempo se ejecuta su programa obtenga la fecha/hora actual y reste la fecha de inicio de la aplicación.

20

Un método muy simple:

#include <time.h> 
time_t start = time(0); 

double seconds_since_start = difftime(time(0), start); 

El principal inconveniente de esto es que usted tiene que sondear para las actualizaciones. Necesitará soporte de plataforma u otro lib/framework para hacer esto de forma eventual.

+3

'time()' devuelve la hora del reloj de pared, 'clock()' devuelve el tiempo del procesador. –

+0

+1 Hombre, me confunden las cosas de fecha/hora siempre :) – AraK

+0

'clock()' podría ser útil, también ... Como el OP solo está interesado en el tiempo transcurrido, el tiempo de pared puede no ser necesario. Además, para programas de larga ejecución, 'time()' puede verse influenciado por cosas como derivas de NTP, DST, cambios de usuario, etc. Eso puede arrojar los resultados. – jheddings

4

Te estás acercando hacia atrás. En lugar de tener una variable que tiene que preocuparse por actualizar cada segundo, simplemente inicialice una variable en el inicio del programa con la hora actual, y cada vez que necesite saber cuántos segundos han transcurrido, restará la hora actual de esa hora inicial. Mucho menos sobrecarga de esa manera, y no hay necesidad de alimentar algunas actualizaciones de variables relacionadas con el tiempo.

+1

"Enfermería" una variable, ¡ahora eso es un concepto! Uno que a menudo me pasa por alto por consideraciones de rendimiento. Momento de AHA total aquí ... – FredTheWebGuy

1
#include <stdio.h> 
#include <time.h> 
#include <windows.h> 
using namespace std; 
void wait (int seconds); 
int main() 
{ 
    time_t start, end; 
    double diff; 
    time (&start); //useful call 
    for (int i=0;i<10;i++) //this loop is useless, just to pass some time. 
    { 
    printf ("%s\n", ctime(&start)); 
    wait(1); 
    } 
    time (&end);//useful call 

    diff = difftime(end,start);//this will give you time spent between those two calls. 
    printf("difference in seconds=%f",diff); //convert secs as u like 
    system("pause"); 
    return 0; 
} 
void wait (int seconds) 
{ 
    clock_t endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC ; 
    while (clock() < endwait) {} 
} 

esto debería funcionar bien en Solaris/Unix también, basta con retirar árbitros ganar

10

Uso std::chrono.

#include <chrono> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    auto start_time = std::chrono::high_resolution_clock::now(); 
    auto current_time = std::chrono::high_resolution_clock::now(); 

    std::cout << "Program has been running for " << std::chrono::duration_cast<std::chrono::seconds>(current_time - start_time).count() << " seconds" << std::endl; 

    return 0; 
} 

Si sólo necesita una resolución de segundos, luego std::steady_clock debería ser suficiente.

+1

std :: chrono es nuevo en C++ 11, por lo que es posible que el compilador no lo admita. – frnknstn

+2

He respondido +1 a su respuesta para el enfoque C++ 11, pero desafortunadamente no se compila en mi GCC 4.8.4 con C++ 11 habilitado.Lo que funcionó fue utilizar 'duration_cast' en la salida:' std :: chrono :: duration_cast > (current_time - start_time) .count() '. – Scylardor

Cuestiones relacionadas