Неблокирующий таймер сна в C - PullRequest
3 голосов
/ 14 октября 2011

Я ищу хороший неблокирующий таймер сна в C для Windows.

В настоящее время я использую sleep(10);, что, конечно, является таймером блокировки.

Также я хочу, чтобы он не потреблял системных ресурсов, например, мой таймер отключения не использует ресурсы ЦП или системы, которыми я доволен.

Итак, какой самый лучший неблокирующий таймер сна я могу использовать? И, пожалуйста, также приведите пример того, как его использовать.

Спасибо.

Ответы [ 5 ]

4 голосов
/ 14 октября 2011

Вам не нужен API, вам нужно изменить свой дизайн.

Простое это.

Вы можете иметь несколько потоков, один из которых является потоком менеджера, а другой - рабочими потоками. Каждые 10 секунд управляющий поток просыпается, создает новый рабочий поток и переходит в спящий режим. Рабочие потоки будут продолжать работать, даже когда диспетчер спит, и это дает вам неблокирующие эффекты.

Я не знаю, насколько вы знакомы с потоками, но вот очень простой учебник , который может помочь вам начать с этим.

0 голосов
/ 11 мая 2015

Решение в этом вопросе, ответьте на ваше?

Таймер для реализации функции тайм-аута

С уважением, Toonie.

0 голосов
/ 14 октября 2011

В Windows у вас есть следующие опции:

Также следует помнить, что функция обратного вызова таймера будет запускаться в другом потоке, чем ваше приложение.Поэтому, если функция обратного вызова использует те же данные, что и основной поток, вам необходимо защитить их (используя Mutex, CriticalSection и т. Д.), Чтобы исключить одновременный доступ для нескольких потоков.

0 голосов
/ 14 октября 2011

Исходя из недавнего комментария ОП к вопросам, звучит так, как будто цель состоит в том, чтобы позволить программе продолжить обработку, но иметь возможность вызывать некоторую функцию каждые 10 секунд.Одним из способов предоставления этой функциональности может быть создание отдельного потока , в обязанности которого входит выполнение некоторой функции каждые 10 секунд.Он может использовать Sleep( 10000 ), чтобы заблокировать себя, затем вызвать функцию, затем перевести в спящий режим и т. Д.

В этом случае основной поток не будет заблокирован и может продолжить свою работу.

0 голосов
/ 14 октября 2011

Win32 API имеет SetTimer () . С этой страницы связаны примеры кода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...