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
#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库已扩展为包含以下用户定义的文字:
std::literals::chrono_literals::operator""hstd::literals::chrono_literals::operator""minstd::literals::chrono_literals::operator""sstd::literals::chrono_literals::operator""msstd::literals::chrono_literals::operator""usstd::literals::chrono_literals::operator""ns实际上这意味着你可以写这样的东西.
#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而不是直接进行系统调用.
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)
库存解决方案是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)
| 归档时间: |
|
| 查看次数: |
38196 次 |
| 最近记录: |