C++ でミリ秒単位でスリープする方法
胡金庫
2023年10月12日
-
C++ でスリープするには
std::this_thread::sleep_for
メソッドを使用する -
C++ でスリープさせるには
usleep
関数を使用する -
C++ でスリープするには
nanosleep
関数を使用する
この記事では、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
名前空間 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;
}