マクロでクロスプラットフォームのスリープコードを作成することは可能ですか?例クロスプラットフォームC++のスリープ関数
#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
マクロでクロスプラットフォームのスリープコードを作成することは可能ですか?例クロスプラットフォームC++のスリープ関数
#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
はいあります。次に、あなたのコードではなく、直接システム呼び出しを行うよりも、スリープ状態にmySleep
を呼び出し
#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
}
:あなたがやっていることは、別のシステムは、独自の機能で通話を眠るだけでなく、以下のような記述が含まラップです。
については はBoostを取得します。
#include <boost/thread/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
...
boost::this_thread::sleep(boost::posix_time::millisec(milliseconds));
これはC++ 11になりました。 'posix_time'は' chrono'と呼ばれます。 – anthropomorphic
ストックソリューションは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);
興味深い解決策ですが、私は 'shf301'の答えに対するあなたのコメントが好きです。 –
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);
のように書くでしょう。しかし、これはC++11とlaterでのみ機能します。 ms
あなたはミリ秒単位で眠りたい時間の量がある
#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
。
またnanoseconds
、microseconds
、seconds
、minutes
、またはhours
とmilliseconds
を置き換えることができます。 (これらは、タイプstd::chrono::durationの専門です。)
更新:あなたは、時間の設定量のために眠っている場合C++14で、例えば100ミリ秒間、std::chrono::milliseconds(100)
は100ms
のように記述することができます。これは、user defined literalsが原因であり、C++11に導入されました。
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
chrono
ライブラリは、次のユーザー定義リテラルを含むように拡張されています
これは効果的にこれはあなたがこのようなものを書くことができることを意味します。 using namespace std::literals::chrono_literals
がnamespace pollutionの最小量を提供するが、これらの演算子はまた、場合using namespace std::literals
、又はusing namespace std::chrono
利用可能である、こと
#include <chrono>
#include <thread>
using namespace std::literals::chrono_literals;
std::this_thread::sleep_for(100ms);
注意。
shf301は良いアイデアを持っていたが、この方法は、より良い:
#ifdef _WINDOWS
#include <windows.h>
#else
#include <unistd.h>
#define Sleep(x) usleep((x)*1000)
#endif
その後、このように使用:
Sleep(how_many_milliseconds);
便利!ありがとうございました! :) – cmcromance
だけで行う
現在の時刻をチェックし#include <ctime>
int Sleep(int ms)
{
clock_t starting = clock();
while(clock() - starting < ms) {}
return 0;
}
(ミリ秒単位)、開始時間を引いて、関数が使用する時間を求めます。その数が臨界値(目標時間長)よりも小さい場合は、何もせず、少々時間がかかります。これは、時間が臨界値を超えるまで繰り返され、そこで停止する。
EDIT:あなたは離れてヒュープロセッサを気にしてC++ 11を持っていない場合は、固定コードのミスは
は、 ''を使用することができます。 –
chris
なぜプロセッサが旋回するのですか? C++ 11を使っているなら 'std :: this_thread :: sleep_for(std :: chrono :: milliseconds(n))'のようなものを使うことができます。これはCPUを消費するべきではありません。 –
その純粋なC++。 – ElSajko