2009-11-14 7 views
9

Я пишу программу, которая будет использоваться на машине Solaris. Мне нужен способ отслеживать, сколько секунд прошло с момента запуска программы. Я говорю здесь очень просто. Например, у меня будет int seconds = 0; но как бы я начал обновлять переменную секунд с каждой секундой?C++ Отслеживание того, сколько секунд прошло с момента запуска программы

Кажется, что некоторые из функций времени, которые я смотрел, работают только на машинах Windows, поэтому я просто не уверен.

Любые предложения будут оценены.

Спасибо за ваше время.

+0

Вам нужно событие каждую секунду? обновить что-нибудь? или всего полных секунд выполнения программы? – Dani

ответ

0

Вам просто нужно сохранить дату/время при запуске приложения. Всякий раз, когда вам нужно отображать, как долго работает ваша программа, получите текущую дату/время и вычтите, когда приложение запустилось.

20

очень простой метод:

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

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

Основной недостаток состоит в том, что вы должны опрашивать для обновления. Для этого вам понадобится поддержка платформы или какая-либо другая библиотека lib/framework.

+3

'time()' возвращает настенное время, 'clock()' возвращает процессор-время. –

+0

+1 Человек, меня всегда путают данные о дате/времени :) – AraK

+0

'clock()' тоже может быть полезным ... Поскольку OP интересуется только временем, настенное время может не понадобиться. Кроме того, для длительных программ на «time()» могут влиять такие вещи, как дрейфы NTP, DST, пользовательские изменения и т. Д. Это может отбросить результаты. – jheddings

4

Вы приближаетесь к нему назад. Вместо того, чтобы иметь переменную, вам приходится беспокоиться об обновлении каждую секунду, просто инициализируйте переменную в начале программы с текущим временем, а затем, когда вам нужно знать, сколько секунд прошло, вы вычитаете текущее время с этого начального времени. Гораздо меньше накладных расходов, и нет необходимости кормить некоторое изменение времени, связанное с переменным.

+1

«Уход» переменная - теперь это концепция! Тот, который часто игнорируется мной для соображений производительности. Общий момент AHA здесь ... – 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) {} 
} 

это должно работать нормально на Солярис/Unix также, просто удалить выигрышные реф

10

Использование 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; 
} 

Если вам нужно только разрешение секунд, затем std::steady_clock должно быть достаточно.

+1

std :: chrono является новым в C++ 11, поэтому ваш компилятор может его не поддерживать. – frnknstn

+2

I + 1 ваш ответ для подхода C++ 11, но, к сожалению, он не компилируется на моем GCC 4.8.4 с включенным C++ 11.Что работало, хотя использовало 'duration_cast' в выводе:' std :: chrono :: duration_cast > (current_time - start_time) .count() '. – Scylardor