46

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

#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是你想睡觉的时间,以毫秒为单位。

您也可以替换millisecondsnanosecondsmicrosecondssecondsminuteshours。(这些是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);

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

于 2012-06-30T18:18:12.617 回答
44

就在这里。您所做的是将不同的系统睡眠调用包装在您自己的函数中,以及如下的包含语句:

#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睡眠而不是直接进行系统调用。

于 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 回答
19

获得升压

#include <boost/thread/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
...
boost::this_thread::sleep(boost::posix_time::millisec(milliseconds));
于 2012-06-06T16:33:50.347 回答
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 回答
0

从 c++ 11 开始,你可以这样做。

#include<chrono>
#include<thread>
int main(){
    std::this_thread::sleep_for(std::chrono::milliseconds(x));//sleeps for x milliseconds
    std::this_thread::sleep_for(std::chrono::seconds(x));//sleeps for x seconds  
    std::this_thread::sleep_for(std::chrono::minutes(x));//sleeps for x minutes
    std::this_thread::sleep_for(std::chrono::hours(x));//sleeps for x hours.
  return 0;  
}

我不知道当你能做到这一点时你为什么要使用凌乱的宏,这种方法很棒,跨平台并且包含在 c++ 标准中。

于 2020-06-15T10:13:27.560 回答