Альтернатива функции Sleep для реализации задержки в миллисекундах |
![]() |
Добавил(а) microsin |
При портировании исходного кода с платформы Windows на Linux часто встает проблема замены функции Sleep(), которая определена в заголовочном файле windows.h. Задержка для этой функции передается через параметр, указываемый в миллисекундах. В старом стандарте POSIX определена функция usleep(), так что она доступна на Linux: int usleep(useconds_t usec); В её параметре указывается задержка в микросекундах. В настоящее время функция считается устаревшей, и желательно её заменять на функцию nanosleep(): #include < time.h>
int nanosleep(const struct timespec *req, struct timespec *rem); Функция nanosleep() приостанавливает выполнение вызывавшего потока, пока не истечет по меньшей мере время, указанное в *req, или пока не будет доставлен сигнал, инициирующий вызов обработчика в вызывающем потоке, или пока процесс не будет завершен. Структура timespec используется для указания интервалов времени с наносекундной точностью. Она определена следующим образом: struct timespec { time_t tv_sec; /* секунды */ long tv_nsec; /* наносекунды */ }; Пример реализации функции msleep() на основе nanosleep(), с продолжением задержки, если она была прервана сигналом: #include < time.h>
#include < errno.h>
/* msleep(): приостановка на запрошенное количество миллисекунд. */
int msleep(long msec) { struct timespec ts; int res; if (msec < 0) { errno = EINVAL; return -1; } ts.tv_sec = msec / 1000; ts.tv_nsec = (msec % 1000) * 1000000; do { res = nanosleep(&ts, &ts); } while (res && errno == EINTR); return res;
}
Кроссплатформенный вариант функции задержки: #ifdef WIN32
#include < windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include < time.h> // для nanosleep #else
#include < unistd.h> // для usleep #endif
void sleep_ms(int milliseconds) { #ifdef WIN32
Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L struct timespec ts; ts.tv_sec = milliseconds / 1000; ts.tv_nsec = (milliseconds % 1000) * 1000000; nanosleep(&ts, NULL); #else if (milliseconds >= 1000) sleep(milliseconds / 1000); usleep((milliseconds % 1000) * 1000); #endif
}
[Ссылки] 1. Is there an alternative sleep function in C to milliseconds? site:stackoverflow.com. |