2009-11-14 5 views
9

Ich schreibe ein Programm, das auf einem Solaris-Rechner verwendet wird. Ich brauche eine Möglichkeit, zu verfolgen, wie viele Sekunden seit dem Start des Programms verstrichen sind. Ich rede hier sehr einfach. Zum Beispiel hätte ich eine int Sekunden = 0; Aber wie würde ich die Sekundenvariable aktualisieren, wenn jede Sekunde passiert?C++ Verfolgen, wie viele Sekunden seit dem Start des Programms vergangen sind

Es scheint, dass einige der verschiedenen Zeitfunktionen, die ich angeschaut habe, nur auf Windows-Rechnern funktionieren, also bin ich mir einfach nicht sicher.

Irgendwelche Vorschläge würden geschätzt.

Danke für Ihre Zeit.

+0

Benötigen Sie jede Sekunde ein Ereignis? etwas aktualisieren? oder nur die gesamten Sekunden, die das Programm läuft? – Dani

Antwort

0

Sie müssen nur das Datum/die Uhrzeit speichern, als die Anwendung gestartet wurde. Wann immer Sie anzeigen möchten, wie lange Ihr Programm läuft, erhalten Sie das aktuelle Datum/die aktuelle Uhrzeit und subtrahieren Sie den Zeitpunkt, zu dem die Anwendung gestartet wurde.

20

Eine sehr einfache Methode:

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

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

Der Hauptnachteil ist, dass Sie für das Updates abzufragen haben. Sie benötigen Plattformunterstützung oder ein anderes lib/Framework, um dies auf einer Ereignisbasis zu tun.

+3

'time()' gibt die Wanduhrzeit zurück, 'clock()' gibt die Prozessorzeit zurück. –

+0

+1 Mann, ich werde immer durch das Datum/Zeit Zeug verwirrt :) – AraK

+0

'clock()' könnte auch nützlich sein ... Da das OP nur an der verstrichenen Zeit interessiert ist, ist die Wandzeit möglicherweise nicht notwendig. Zusätzlich kann 'time()' für lang laufende Programme durch Dinge wie NTP-Drifts, DST, Benutzeränderungen usw. beeinflusst werden. Das kann die Ergebnisse abwerfen. – jheddings

4

Sie nähern sich rückwärts. Anstatt eine Variable zu haben, müssen Sie sich sorgen, dass jede Sekunde aktualisiert wird, initialisieren Sie einfach eine Variable beim Programmstart mit der aktuellen Zeit, und dann, wenn Sie wissen möchten, wie viele Sekunden verstrichen sind, subtrahieren Sie die jetzt aktuelle Zeit von dieser Anfangszeit. Viel weniger Overhead auf diese Weise und keine Notwendigkeit, einige Timing-bezogene Variablenupdates zu warten.

+1

"Krankenpflege" eine Variable - das ist ein Konzept! Eine, die ich oft für Leistungsüberlegungen übersehen habe. Total AHA Moment hier ... – 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) {} 
} 

sollte dies auch auf solaris/Unix funktionieren, entfernen Sie einfach Refs Sieg

10

Verwendung 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; 
} 

Wenn Sie nur eine Auflösung von Sekunden benötigen, dann sollten std::steady_clock ausreichend sein.

+1

Std :: Chrono ist neu in C++ 11, so dass Ihr Compiler es möglicherweise nicht unterstützt. – frnknstn

+2

I + 1'd Ihre Antwort für den C++ 11-Ansatz, aber leider kompiliert es nicht auf meinem GCC 4.8.4 mit C++ 11 aktiviert.Was funktionierte, war 'duration_cast' in der Ausgabe:' std :: chrono :: duration_cast (aktuelle_Zeit - start_time) .count() '. – Scylardor

Verwandte Themen