C++ でミリ秒単位でスリープする方法

胡金庫 2023年10月12日
  1. C++ でスリープするには std::this_thread::sleep_for メソッドを使用する
  2. C++ でスリープさせるには usleep 関数を使用する
  3. C++ でスリープするには nanosleep 関数を使用する
C++ でミリ秒単位でスリープする方法

この記事では、C++ でミリ秒単位でスリープするためのメソッドを紹介します。

C++ でスリープするには std::this_thread::sleep_for メソッドを使用する

このメソッドは、<thread> ライブラリの sleep 関数の純粋な C++ 版であり、Windows と Unix の両方のプラットフォームに対応した移植版です。より良いデモの例として、3000 ミリ秒の間処理を中断しています。

#include <chrono>
#include <iostream>
#include <thread>

using std::cin;
using std::cout;
using std::endl;
using std::this_thread::sleep_for;

constexpr int TIME_TO_SLEEP = 3000;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      sleep_for(std::chrono::milliseconds(TIME_TO_SLEEP));
    }
  }
  return 0;
}

出力:

Started loop...
Iteration - 0
Iteration - 1
Iteration - 2
Iteration - 3
Iteration - 4
Sleeping ....
Iteration - 5
Iteration - 6
Iteration - 7
Iteration - 8
Iteration - 9

Cpp でのスリープ方法

名前空間 std::chrono_literals を利用することで、上記のコードをより雄弁に書き換えることができます。

#include <iostream>
#include <thread>

using std::cin;
using std::cout;
using std::endl;
using std::this_thread::sleep_for;
using namespace std::chrono_literals;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      sleep_for(3000ms);
    }
  }
  return 0;
}

C++ でスリープさせるには usleep 関数を使用する

usleep は、<unistd.h> ヘッダーで定義された POSIX 固有の関数であり、マイクロ秒数を引数として受け入れます。これは、符号なし整数型である必要があり、[0,1000000] の範囲の整数を保持できます。

#include <unistd.h>

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

constexpr int TIME_TO_SLEEP = 3000;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      usleep(TIME_TO_SLEEP * 1000);
      ;
    }
  }
  return 0;
}

あるいは、usleep 関数を使ってカスタムマクロを定義し、より再利用可能なコードスニペットを作ることもできます。

#include <unistd.h>

#include <iostream>

#define SLEEP_MS(milsec) usleep(milsec * 1000)

using std::cin;
using std::cout;
using std::endl;

constexpr int TIME_TO_SLEEP = 3000;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      SLEEP_MS(TIME_TO_SLEEP);
    }
  }
  return 0;
}

C++ でスリープするには nanosleep 関数を使用する

nanosleep 関数は、割り込みをより良く処理し、スリープ間隔をより細かく設定できる POSIX 固有の別バージョンです。つまり、プログラマは timespec 構造体を作成して秒数とナノ秒数を別々に指定します。nanosleep はまた、プログラムが信号によって中断された場合に残りの時間間隔を返すために、2 番目の timespec 構造体のパラメータを取ります。割り込みの処理はプログラマが行うことに注意してください。

#include <ctime>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;

constexpr int SECS_TO_SLEEP = 3;
constexpr int NSEC_TO_SLEEP = 3;

int main() {
  struct timespec request {
    SECS_TO_SLEEP, NSEC_TO_SLEEP
  }, remaining{SECS_TO_SLEEP, NSEC_TO_SLEEP};

  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;
    if (i == 4) {
      cout << "Sleeping ...." << endl;
      nanosleep(&request, &remaining);
    }
  }
  return 0;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook