2012-06-06 8 views
31

マクロでクロスプラットフォームのスリープコードを作成することは可能ですか?例クロスプラットフォームC++のスリープ関数

#ifdef LINUX 
#include <header_for_linux_sleep_function.h> 
#endif 
#ifdef WINDOWS 
#include <header_for_windows_sleep_function.h> 
#endif 
... 
Sleep(miliseconds); 
... 
+0

は、 '' を使用することができます。 – chris

+12

なぜプロセッサが旋回するのですか? C++ 11を使っているなら 'std :: this_thread :: sleep_for(std :: chrono :: milliseconds(n))'のようなものを使うことができます。これはCPUを消費するべきではありません。 –

+0

その純粋なC++。 – ElSajko

答えて

36

はいあります。次に、あなたのコードではなく、直接システム呼び出しを行うよりも、スリープ状態に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 
} 

:あなたがやっていることは、別のシステムは、独自の機能で通話を眠るだけでなく、以下のような記述が含まラップです。

+7

#ifdef LINUX intスリープ(int sleepMs){return usleep(sleepMs * 1000); } #endif – Joshua

+0

これは素晴らしいことですが、usleepはCPU消費を止めません。例えば、while(1){usleep(1000 * 1000);/* 1sec?*/cout << 1; }そして、この1秒後、出力は "1"文字の多くです。 – ElSajko

+0

@KamilKrzyszczuk:いいえ、 'usleep'はCPUを消費せず、しばらくプロセスを停止します。 –

18

については はBoostを取得します。

#include <boost/thread/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
... 
boost::this_thread::sleep(boost::posix_time::millisec(milliseconds)); 
+6

これはC++ 11になりました。 'posix_time'は' chrono'と呼ばれます。 – anthropomorphic

8

ストックソリューションは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); 
+0

興味深い解決策ですが、私は 'shf301'の答えに対するあなたのコメントが好きです。 –

1

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); 
47

のように書くでしょう。しかし、これはC++11laterでのみ機能します。 msあなたはミリ秒単位で眠りたい時間の量がある

#include <chrono> 
#include <thread> 
... 
std::this_thread::sleep_for(std::chrono::milliseconds(ms)); 

またnanosecondsmicrosecondssecondsminutes、またはhoursmillisecondsを置き換えることができます。 (これらは、タイプstd::chrono::durationの専門です。)

更新:あなたは、時間の設定量のために眠っている場合C++14、例えば100ミリ秒間、std::chrono::milliseconds(100)100msのように記述することができます。これは、user defined literalsが原因であり、C++11に導入されました。

01: C++14chronoライブラリは、次のユーザー定義リテラルを含むように拡張されています

これは効果的にこれはあなたがこのようなものを書くことができることを意味します。 using namespace std::literals::chrono_literalsnamespace 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); 

注意。

19

shf301は良いアイデアを持っていたが、この方法は、より良い:

#ifdef _WINDOWS 
#include <windows.h> 
#else 
#include <unistd.h> 
#define Sleep(x) usleep((x)*1000) 
#endif 

その後、このように使用:

Sleep(how_many_milliseconds); 
+1

便利!ありがとうございました! :) – cmcromance

-2

だけで行う

現在の時刻をチェックし
#include <ctime> 
int Sleep(int ms) 
{ 
    clock_t starting = clock(); 
    while(clock() - starting < ms) {} 
    return 0; 
} 

(ミリ秒単位)、開始時間を引いて、関数が使用する時間を求めます。その数が臨界値(目標時間長)よりも小さい場合は、何もせず、少々時間がかかります。これは、時間が臨界値を超えるまで繰り返され、そこで停止する。

EDIT:あなたは離れてヒュープロセッサを気にしてC++ 11を持っていない場合は、固定コードのミスは

関連する問題