2009-11-14 2 views
9

Solaris 컴퓨터에서 사용될 프로그램을 작성하고 있습니다. 프로그램 시작 후 몇 초가 지난지를 추적하는 방법이 필요합니다. 나는 여기서 아주 간단하게 말하고있다. 예를 들어 나는 int 초 = 0; 하지만 각 초가 지나갈 때 초 변수를 업데이트하는 방법은 무엇입니까?C++ 프로그램 시작 후 몇 초가 경과했는지 추적합니다.

내가 본 여러 시간 함수 중 일부는 Windows 시스템에서만 작동하므로 일부만은 확실하지 않습니다.

의견을 보내 주시면 감사하겠습니다.

감사합니다.

+0

초마다 이벤트가 필요합니까? 뭔가 업데이트? 또는 프로그램이 실행되는 총 시간은 몇 초입니까? – Dani

답변

0

응용 프로그램을 시작할 때 날짜/시간 만 저장하면됩니다. 프로그램 실행 시간을 표시해야 할 때마다 현재 날짜/시간을 가져오고 응용 프로그램 시작 시간을 뺍니다.

20

아주 간단한 방법 :

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

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

이의 주요 단점은 업데이트를 폴링해야한다는 것입니다. 이벤트 기반으로이를 수행하려면 플랫폼 지원 또는 기타 lib/프레임 워크가 필요합니다.

+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) {} 
} 

이 Solaris에서 잘 작동합니다/유닉스는 단지 승리의 심판

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

C++ 11 접근법에 대한 답을 +1했으나 안타깝게도 C++ 11을 사용하는 GCC 4.8.4에서는 컴파일되지 않습니다.무슨 일을했는지는 출력에서'duration_cast'를 사용하고 있습니다 :'std :: chrono :: duration_cast > (current_time - start_time) .count()'. – Scylardor

관련 문제