Cross platform Sleep function for C++
Yup. But this only works in C++11 and later.
#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
where ms
is the amount of time you want to sleep in milliseconds.
You can also replace milliseconds
with nanoseconds
, microseconds
, seconds
, minutes
, or hours
. (These are specializations of the type std::chrono::duration.)
Update: In C++14, if you're sleeping for a set amount of time, for instance 100 milliseconds, std::chrono::milliseconds(100)
can be written as 100ms
. This is due to user defined literals, which were introduced in C++11. In C++14 the chrono
library has been extended to include the following user defined literals:
std::literals::chrono_literals::operator""h
std::literals::chrono_literals::operator""min
std::literals::chrono_literals::operator""s
std::literals::chrono_literals::operator""ms
std::literals::chrono_literals::operator""us
std::literals::chrono_literals::operator""ns
Effectively this means that you can write something like this.
#include <chrono>
#include <thread>
using namespace std::literals::chrono_literals;
std::this_thread::sleep_for(100ms);
Note that, while using namespace std::literals::chrono_literals
provides the least amount of namespace pollution, these operators are also available when using namespace std::literals
, or using namespace std::chrono
.
Yes there is. What you do is wrap the different system sleeps calls in your own function as well as the include statements like below:
#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
}
Then your code calls mySleep
to sleep rather than making direct system calls.
shf301 had a good idea, but this way is better:
#ifdef _WINDOWS
#include <windows.h>
#else
#include <unistd.h>
#define Sleep(x) usleep((x)*1000)
#endif
Then use like this:
Sleep(how_many_milliseconds);