Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов процедуры с определенной частотой

31K
08 декабря 2008 года
dreamer.mas
69 / / 15.11.2008
Возможно ли реализовать вызов определенного кода со строго заданным количеством вызовов в секунду? Количество может быть, например, 101, то есть варианты типа while(true){sleep(...); /*dosmth*/} не пройдут.

Если это возможно то как и какова вероятность погрешности?

P.S. Имеется в виду, что время между вызовами будет одинаковое.
397
08 декабря 2008 года
SergPas
527 / / 03.02.2007
Воспользуйтесь таймером... WinAPI таймер задаётся с точностью до миллисекунды...
31K
08 декабря 2008 года
dreamer.mas
69 / / 15.11.2008
А там можно установить дилей 9.9009900990099009900990099009901 миллисекунды? Я ж написал, что количество может быть, например, 101 (1000 на 101 ну никак нацело не делится)...
397
08 декабря 2008 года
SergPas
527 / / 03.02.2007
Да уж... Ответил не задумываясь - извиняюсь... Интересный вопрос... А Вы уверены, что код вообще выполнится за это короткое время?
31K
08 декабря 2008 года
dreamer.mas
69 / / 15.11.2008
Ну, должен, наверно :)
535
08 декабря 2008 года
Нездешний
537 / / 17.01.2008
Цитата из Рихтера "Создание эффективных Win32 приложений"
Цитата:
Меня часто спрашивают, как сделать так, чтобы поток гарантированно запускался в течение определенного времени после какого-нибудь события — например, не позднее чем через миллисекунду после приема данных с последовательного порта? Ответ прост: никак. Такие требования можно предъявлять к операционным системам реального времени, но Windows к ним не относится.

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

1.9K
08 декабря 2008 года
andriano
474 / / 10.01.2008
Если имеется в виду стандартный IBM PC и ОС Windows, то "прямо" - никак.
Нужно или нестандартное аппаратное обеспечение, или ОС реального времени, или и то, и другое.
В принципе, в качестве "нестандартного оборудования" можно попытаться использовать звуковую карту и повесить процедуру, которая должна выполняться с определенной периодичностью на прерывание звуковой карты.

PS. Скажу сразу: таймер Windows обладает явно недостаточной точностью, чтобы удовлетворять поставленной задаче - 101 за секунду. Если бы было 101, скажем, за минуту, то, вполне вероятно, он бы и справился с поставленной задачей.
31K
08 декабря 2008 года
dreamer.mas
69 / / 15.11.2008
Понятно. Спасибо за ответы.
9.3K
08 декабря 2008 года
iridum
175 / / 26.08.2007
Обычные аймеры - асинхронный механизм, там даже о 20 милисекундах реч не всегда идёт.

Но есть возможность определить время. (например с точночтью до милисекунды) GetTickCount() или timeGetTime();
И есть возможность с помощью обычных циклов организовать задержку любой точности, и тут дискретность времени может быть почти сколько угодно мала. Ведь int i = 2; будет выполнятся за ничтожное время, там даже не о наносекундах наверное.
Тоесть можно рекурсивно, вызывая функцию-функтор, и определяя необходимую задержку с помощью ф-й GetTickCount() (или каки-то наподобие) добиться более-менее работающего решения, но опять таки о очень точных отрезках времени реч не идёт вообще. Думаю большое число задач можно и таким способом решить.

ps. Это конечно пластилин обмотаный старой изолентой :p но как вариант
535
09 декабря 2008 года
Нездешний
537 / / 17.01.2008
Цитата: iridum
Но есть возможность определить время. (например с точночтью до милисекунды) GetTickCount() или timeGetTime();
И есть возможность с помощью обычных циклов организовать задержку любой точности, и тут дискретность времени может быть почти сколько угодно мала. Ведь int i = 2; будет выполнятся за ничтожное время, там даже не о наносекундах наверное.

А если во время работы этих циклов кто-нибудь запустит сильно нагруженный поток с приоритетом повыше?

87
09 декабря 2008 года
Kogrom
2.7K / / 02.02.2008
Есть книга Юрия Щупака "Win32 API Эффективная разработка приложений". Не буду ее особо хвалить, но работа со временем там приведена хорошо: рассмотрена работа с мультимедийным таймером (который работает намного стабильнее, чем стандартный), и разные способы измерять промежутки времени в микросекундах и даже меньше.

Естественно, и там упомянуто, что Windows - это не система реального времени.
1.9K
09 декабря 2008 года
andriano
474 / / 10.01.2008
iridium,
GetTickCount хотя и выдает время в мс, имеет такую же погрешность, т.е. порядка тех же 20 мс.
241
10 декабря 2008 года
Sanila_san
1.6K / / 07.06.2005
Каждому потоку выделяется примерно по 20 мс времени, поэтому расчитывать на более или менее определённый delay можно только в пределах этого промежутка.

К сожалению, автор не сказал, для чего ему такое решение. Я сейчас могу предположить, что строится какая-то система обработки внешних сигналов, и в этом случае может быть правильнее обеспечить не гарантированное время отклика (что в Windows можно только в известных пределах, и то с вероятностью < 1), а гарантированную пропускную способность. Это делается несколько проще.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог