4

プログラムが開始されてからの経過時間 (壁時計時間) を取得する方法が必要です。これは、ユーザーがシステム クロックに干渉しても回復できる方法です。

Windows では、非標準の clock() 実装ではうまくいきません。起動時にサンプリングされた時間との差を計算するだけで機能するように見えるため、「時計の針を戻す」と負の値が得られます。 .

UNIX では、clock/getrusage はシステム時刻を参照しますが、gettimeofday などの関数を使用してタイムスタンプをサンプリングすると、Windows で clock を使用するのと同じ問題があります。

私は精度にはあまり興味がありません.0.5秒の解像度タイマーをバックグラウンドで回転させて、クロックスキューが発生したときにクロックスキューに対抗することで解決策をハックしました(サンプル時間と予想時間の差が1秒を超える場合)新しいベースラインに予想されるタイマーを使用します)が、もっと良い方法があるに違いないと思います。

4

6 に答える 6

2

POSIXの場合は、と一緒に使用clock_gettime()CLOCK_MONOTONICます。

于 2009-05-01T17:58:58.303 に答える
2

いつでも何らかのタイマーを開始できると思います。たとえば、Linux では、次のようなループを持つスレッドがあります。

static void timer_thread(void * arg)
{
        struct timespec delay;
        unsigned int msecond_delay = ((app_state_t*)arg)->msecond_delay;

        delay.tv_sec = 0;
        delay.tv_nsec = msecond_delay * 1000000;

        while(1) {
                some_global_counter_increment();
                nanosleep(&delay, NULL);
        }
}

app_state_t変数を保存する場合、選択したアプリケーション構造はどこにありますか。改ざんを防ぎたい場合は、誰もスレッドを強制終了していないことを確認する必要があります

于 2008-10-14T15:26:34.977 に答える
1

それを行うクロスプラットフォームの方法が見つかるとは思いません。

Windows で必要なのはGetTickCount (または、高解像度タイマーの場合はQueryPerformanceCounterQueryPerformanceFrequency ) です。Linux での経験はありませんが、Google で検索するとclock_gettimeが表示されました。

于 2008-10-14T11:56:11.250 に答える
0

壁時計の時間は、 time()呼び出しで少し計算できます。

于 2008-10-14T12:37:04.927 に答える
-1

ネットワーク接続があれば、いつでも NTP サーバーから時刻を取得できます。これは明らかに、どのローカル クロックにも影響しません。

于 2008-10-14T10:37:21.067 に答える
-1

Linux の /proc/uptime は、システムが稼働していた秒数 ​​(およびアイドル状態だった秒数) を維持します。これは、システム割り込み (jiffies / HZ) によって維持されるため、クロックの変更の影響を受けないはずです。 . おそらくWindowsにも似たようなものがありますか?

于 2008-10-14T13:45:43.777 に答える