Есть задача получать управление через заданные промежутки времени. Период должен быть в пределах 30-50 мс. Пользовался ожидающим таймером. Устанавливал разрешение таймера timeBeginPeriod(UINT uPeriod). У ожидающего потока выставлял максимальный приоритет (у процесса тоже устанавливал максимальный класс приоритета). Всё хорошо, но когда начинается свопирование все мои усилия идут лесом Мой поток занимается тем, что опрашивает устройство (разумеется посредством драйвера). Драйвер элементарный. Просто пердоставляет доступ к портам и ещё небольшой сервис. Есть идея сделать опрос в драйвере. Использую обычный таймер, который ставит в очердь мой объект DPC. Я так понял, что этот таймер имеет свой период в 15мс. Отсюда вопросы: 1. Можно ли сделать таймер более точным из KernelMode на подобие timeBeginPeriod в UserMode ? 2. Очень хочется услышать алтернативные предложения
Есть такая штука как мультимедийный таймер . timeSetEvent() . В первом параметре - интервал в милисекундах . Можно ставить хоть 1 мс. Главное не ноль (системные потери будут).
Спасибо, TermoSINteZ. Знаю я об этом. Точность хорошая. Но грабли те же. При свопировании, он срабатывает гораааздо позже. Насколько я понимаю, тут дело в приоритетах. Поэтому я ушёл в KernelMode и использую таймер, который ставит в очередь мой DPC объект (у DPC приоритет выше чем у подкачки). Как сделать дискретность этого таймера поменьше ? Или может вообще как-то подключиться к прерыванию таймера. Советы и ссылки приветствуются.
Maveric, бьюсь с той же проблемой, приоритеты ни на что не повлияли по сути... не пождскажешь как реализовал и вообще все ли теперь стабильно получилось? Может где нить примеры есть? Я тольком ничего не нашел, правда искал с упором на приоритеты м мультимедийный таймер, может в данном случае он вообще иной???
Maveric Обсуждалось на Васме года 3-4 назад. Можно попробовать отключить свопирование. Но, боюсь, это не оно, а priority boosting. Т.е. в Винде раз в 4-5 сек принудительно прерываются даже самые высокоприоритетные потоки, а управление отдается потокам, давно застрявшим в хвосте очереди. Одно из решений: иметь нормальный или чуть-чуть повышенный priority, а привязку ко времени делать банальным Sleep-ом (чтобы Винда не имела повода пропихивать убогие потоки вперед волюнтаристсткими методами, пускай естественным образом сами туда попадают, пока критический поток спит). З.Ы. Сто раз повторялось: Винда - не РТОС. З.З.Ы. Все ИМХО.