Мне нужно реализовать функцию задержки или сна, которая является точной и последовательной, и должна быть в состоянии отменить .
Вот мой код:
bool cancel_flag(false);
void My_Sleep(unsigned int duration)
{
static const size_t SLEEP_INTERVAL = 10U; // 10 milliseconds
while ((!cancel_flag) && (duration > SLEEP_INTERVAL))
{
Sleep(duration);
duration -= SLEEP_INTERVAL;
}
if ((!cancel_flag) && (duration > 0U))
{
Sleep(duration);
}
}
Вышеуказанная функция запускается в рабочем потоке. Основной поток может изменить значение «cancel_flag», чтобы прервать (отменить) спящий режим.
В моем магазине у нас разные результаты, когда продолжительность составляет 10 секунд (10000 мс). Некоторые компьютеры показывают продолжительность сна 10 секунд, другие компьютеры показывают 16 секунд.
В статьях о функции Sleep () говорится, что она привязана к прерыванию окон, и по истечении этого срока поток переносится (может быть запущен не сразу). Приведенная выше функция может столкнуться с распространением временной ошибки из-за перепланирования и задержки прерывания.
Проект отметки времени Windows описывает другой метод ожидания объекта таймера. Насколько я понимаю, этот метод не предоставляет средства отмены (другим, основным, потоком).
Вопрос:
1. Как я могу улучшить свою реализацию для задержки потока или сна, которая может быть отменена другой задачей, и является более согласованным ?
Можно ли прекратить спящий поток AFX?
(Что происходит, когда основной поток завершает спящий поток AFX?)
Что происходит, когда основной поток завершает поток, вызвавший WaitForSingleObject?
Точность должна составлять около 10 мс, например, 10 секунд + 10 мс.
Результаты должны быть одинаковыми на разных ПК (все под управлением Windows 7 или 10).
Фон
ПК с правильной синхронизацией работают под управлением Windows 7 с частотой 2,9 ГГц.
ПК с неправильной синхронизацией работают под управлением Windows 7 с тактовой частотой 3,1 ГГц и имеют меньше одновременных задач и приложений.
Приложение разработано с использованием Visual Studio 2017 и платформы MFC (с использованием AFX для создания потоков).