Программирование ARM Альтернатива функции Sleep для реализации задержки в миллисекундах Sat, May 04 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Альтернатива функции 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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page