マクロでクロスプラットフォームの Sleep コードを作成することは可能ですか? 例えば
#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
マクロでクロスプラットフォームの Sleep コードを作成することは可能ですか? 例えば
#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
ここms
で、ミリ秒単位でスリープする時間を指定します。
、、、、またはmilliseconds
で置き換えることもできます。(これらはstd::chrono::duration型の特殊化です。)nanoseconds
microseconds
seconds
minutes
hours
更新: C++14では、一定時間 (たとえば 100 ミリ秒) スリープしている場合、std::chrono::milliseconds(100)
として記述できます100ms
。これは、 C++11で導入されたユーザー定義リテラルによるものです。C++14 では、ライブラリが拡張され、次のユーザー定義リテラルが含まれるようになりました。chrono
std::literals::chrono_literals::operator""h
std::literals::chrono_literals::operator""min
std::literals::chrono_literals::operator""s
std::literals::chrono_literals::operator""ms
std::literals::chrono_literals::operator""us
std::literals::chrono_literals::operator""ns
事実上、これは、このようなものを書くことができることを意味します。
#include <chrono>
#include <thread>
using namespace std::literals::chrono_literals;
std::this_thread::sleep_for(100ms);
は名前空間の汚染using namespace std::literals::chrono_literals
を最小限に抑えますが、これらの演算子は、 または の場合にも使用できることに注意してください。using namespace std::literals
using namespace std::chrono
はいあります。あなたがしていることは、以下のような include ステートメントと同様に、独自の関数でさまざまなシステム スリープ コールをラップすることです。
#ifdef LINUX
#include <unistd.h>
#endif
#ifdef WINDOWS
#include <windows.h>
#endif
void mySleep(int sleepMs)
{
#ifdef LINUX
usleep(sleepMs * 1000); // usleep takes sleep time in us (1 millionth of a second)
#endif
#ifdef WINDOWS
Sleep(sleepMs);
#endif
}
次に、コードはmySleep
、直接システム コールを行うのではなく、sleep を呼び出します。
shf301 には良いアイデアがありましたが、この方法の方が優れています。
#ifdef _WINDOWS
#include <windows.h>
#else
#include <unistd.h>
#define Sleep(x) usleep((x)*1000)
#endif
次に、次のように使用します。
Sleep(how_many_milliseconds);
ストック ソリューションは、select() 呼び出しです (Winsock が必要です)。この特定の呼び出しは、Linux と Windows でまったく同じ動作をします。
long value; /* time in microseconds */
struct timeval tv;
tv.tv_sec = value / 1000000;
tv.tv_usec = value % 1000000;
select(0, NULL, NULL, NULL, &tf);
Linux では、usleep には制限があることに注意してください。1000 秒以上「眠る」ことはできません。
私はこのように書くでしょう
struct timespec req={0},rem={0};
req.tv_sec=(milisec/1000);
req.tv_nsec=(milisec - req.tv_sec*1000)*1000000;
nanosleep(&req,&rem);