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

  1. C++でスリープするには std::this_thread::sleep_for メソッドを使う
  2. C++でスリープさせるには usleep 関数を使う
  3. C++でスリープするには nanosleep 関数を使う

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

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

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

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

using std::cout;
using std::cin;
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::cout;
using std::cin;
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 <iostream>
#include <unistd.h>

using std::cout;
using std::cin;
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 <iostream>
#include <unistd.h>

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

using std::cout;
using std::cin;
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 <iostream>
#include <ctime>

using std::cout;
using std::cin;
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;
}
comments powered by Disqus