46

マクロでクロスプラットフォームの Sleep コードを作成することは可能ですか? 例えば

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

7 に答える 7

75

うん。ただし、これはC++11以降でのみ機能します。

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

ここmsで、ミリ秒単位でスリープする時間を指定します。

、、、、またはmillisecondsで置き換えることもできます。(これらはstd::chrono::duration型の特殊化です。)nanosecondsmicrosecondssecondsminuteshours

更新: C++14では、一定時間 (たとえば 100 ミリ秒) スリープしている場合、std::chrono::milliseconds(100)として記述できます100ms。これは、 C++11で導入されたユーザー定義リテラルによるものです。C++14 では、ライブラリが拡張され、次のユーザー定義リテラルが含まれるようになりました。chrono

事実上、これは、このようなものを書くことができることを意味します。

#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::literalsusing namespace std::chrono

于 2012-06-30T18:18:12.617 に答える
44

はいあります。あなたがしていることは、以下のような 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 を呼び出します。

于 2012-06-06T16:38:08.153 に答える
28

shf301 には良いアイデアがありましたが、この方法の方が優れています。

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

次に、次のように使用します。

Sleep(how_many_milliseconds);
于 2013-04-07T10:46:59.497 に答える
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);
于 2012-06-06T16:41:36.577 に答える
1

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);
于 2012-06-07T08:50:15.530 に答える