用于C++的跨平台休眠功能

ElS*_*jko 36 c++ sleep cross-platform

是否可以使用宏来制作跨平台的睡眠代码?例如

#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
Run Code Online (Sandbox Code Playgroud)

Mic*_*rst 61

对.但这仅适用于C++ 11更高版本.

#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
Run Code Online (Sandbox Code Playgroud)

ms您想要以毫秒为单位的睡眠时间在哪里.

您也可以替换milliseconds使用nanoseconds,microseconds,seconds,minutes,或hours.(这些是std :: chrono :: duration类型的特化.)

更新: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);
Run Code Online (Sandbox Code Playgroud)

请注意,虽然using namespace std::literals::chrono_literals提供了最少量的命名空间污染,但这些操作符也可以在using namespace std::literals或时使用using namespace std::chrono.


shf*_*301 42

就在这里.你要做的是在你自己的函数中包装不同的系统sleeps调用以及如下的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
}
Run Code Online (Sandbox Code Playgroud)

然后你的代码调用mySleepsleep而不是直接进行系统调用.

  • #ifdef LINUX int Sleep(int sleepMs){return usleep(sleepMs*1000); } #万一 (7认同)
  • 为什么要为“mySleep”取一个“int”?`unsigned int` 不是更好的选择吗?毕竟,你不能睡负秒!:P (2认同)

Dže*_*nan 23

shf301有一个好主意,但这种方式更好:

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

然后像这样使用:

Sleep(how_many_milliseconds);
Run Code Online (Sandbox Code Playgroud)


Mik*_*e C 18

得到提升.

#include <boost/thread/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
...
boost::this_thread::sleep(boost::posix_time::millisec(milliseconds));
Run Code Online (Sandbox Code Playgroud)

  • 这是现在的C++ 11.`posix_time`虽然被称为`chrono`. (7认同)

Jos*_*hua 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);
Run Code Online (Sandbox Code Playgroud)