2009-11-14 8 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/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) {} 
} 

これは、Solaris上で正常に動作する必要があります/ 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

私はC++ 11のアプローチに対してあなたの答えを+1しましたが、残念ながらGCC 4.8.4でC++ 11を有効にしてコンパイルしません。しかし、出力で 'duration_cast'を使用していました:' std :: chrono :: duration_cast >(current_time - start_time).count() ' – Scylardor

関連する問題