マクロを使用してクロスプラットフォームのスリープコードを作成することは可能ですか?例えば
#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
はいあります。あなたがすることは、あなた自身の関数で異なるシステムスリープコールをラップするだけでなく、以下のようなインクルードステートメントです:
#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
を呼び出してスリープします。
うん。ただし、これは C++ 11 および later でのみ機能します。
_#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
_
ここで、ms
はミリ秒単位のスリープ時間です。
milliseconds
をnanoseconds
、microseconds
、seconds
、minutes
、またはhours
に置き換えることもできます。 (これらは、タイプ std :: chrono :: duration の特殊化です。)
更新: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
_の場合にも使用できることに注意してください。
shf301には良いアイデアがありましたが、この方法の方が優れています。
#ifdef _WINDOWS
#include <windows.h>
#else
#include <unistd.h>
#define Sleep(x) usleep((x)*1000)
#endif
次に、このように使用します:
Sleep(how_many_milliseconds);
Boost を取得します。
#include <boost/thread/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
...
boost::this_thread::sleep(boost::posix_time::millisec(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);