2016-04-04 16 views
2

送信側スレッドから受信側スレッドにパケットを送信しています。送信レート(1秒あたりのパケット数)を制御するために、特定の送信レートを維持するために次のパケットを送信するまでに待つ必要のある時間を計算します。clock()とusleep()が一致しません

待ち時間が100マイクロ秒と計算されたとしましょう。 (double)(clock() - start)/CLOCKS_PER_SEC;

  • 私はそれが再び何であるかを時間をチェックusleep(100);
  • を呼び出します:ステップ3で(double)(clock() - start)/CLOCKS_PER_SEC;
  • 、私はそれだけで何時チェックインの際、私はそれが何であるかを時間をチェック

    1. 50マイクロ秒が経過しました(私はusleepの戻り値をチェックし、それが0を返すことを確認しました)。

      これはなぜですか? 少なくとも 100マイクロ秒で眠ってはいけませんか?または、私はclock()と一緒に使用しなければならない別の睡眠機能がありますか?ご意見ありがとう

    +0

    「usleep」は何を返しますか? 0または-1? – Cornstalks

    +0

    usleepが0を返しています。どのように壁時計の時刻を取得するのですか? –

    +0

    私は例を見つけた。ジョアキムに感謝! –

    答えて

    2

    clock関数は、壁時計ではなく経過時間を与えるように定義されています(残念なことにWindows Visual Studioランタイムライブラリが提供しています)。あなたのプロセスが実際に稼働していない場合は、スリープ状態になるため、プロセッサ時間はかかりません

    ウォールタイムの取得方法はプラットフォームによって異なりますが、POSIX(Linux、OSX、BSDなど) clock_gettime、クロックはCLOCK_REALTIMEです。

    +0

    MSVCの 'clock'関数は非標準的な実装です。また、Windowsには、['GetProcessTimes'関数](https://msdn.microsoft.com/library/windows/desktop/ms683223)と[' QueryProcessCycleTime'関数](https://msdn.microsoft.com/en- gb/library/windows/desktop/ms684929)ではなく 'clock_gettime'です。 –

    関連する問題