Таймер

Тема в разделе "WASM.WIN32", создана пользователем Maveric, 4 апр 2006.

  1. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Есть задача получать управление через заданные промежутки времени. Период должен быть в пределах 30-50 мс. Пользовался ожидающим таймером. Устанавливал разрешение таймера timeBeginPeriod(UINT uPeriod). У ожидающего потока выставлял максимальный приоритет (у процесса тоже устанавливал максимальный класс приоритета). Всё хорошо, но когда начинается свопирование все мои усилия идут лесом :dntknw: Мой поток занимается тем, что опрашивает устройство (разумеется посредством драйвера). Драйвер элементарный. Просто пердоставляет доступ к портам и ещё небольшой сервис.

    Есть идея сделать опрос в драйвере. Использую обычный таймер, который ставит в очердь мой объект DPC. Я так понял, что этот таймер имеет свой период в 15мс.

    Отсюда вопросы:

    1. Можно ли сделать таймер более точным из KernelMode на подобие timeBeginPeriod в UserMode ?

    2. Очень хочется услышать алтернативные предложения :)
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Есть такая штука как мультимедийный таймер . timeSetEvent() . В первом параметре - интервал в милисекундах . Можно ставить хоть 1 мс. Главное не ноль (системные потери будут).
     
  3. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Спасибо, TermoSINteZ. Знаю я об этом. Точность хорошая. Но грабли те же. При свопировании, он срабатывает гораааздо позже. Насколько я понимаю, тут дело в приоритетах. Поэтому я ушёл в KernelMode и использую таймер, который ставит в очередь мой DPC объект (у DPC приоритет выше чем у подкачки). Как сделать дискретность этого таймера поменьше ? Или может вообще как-то подключиться к прерыванию таймера.

    Советы и ссылки приветствуются.
     
  4. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Maveric, бьюсь с той же проблемой, приоритеты ни на что не повлияли по сути... не пождскажешь как реализовал
    и вообще все ли теперь стабильно получилось? Может где нить примеры есть? Я тольком ничего не нашел, правда искал с упором на приоритеты м мультимедийный таймер, может в данном случае он вообще иной???
     
  5. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Maveric

    Обсуждалось на Васме года 3-4 назад.

    Можно попробовать отключить свопирование. Но, боюсь, это не оно, а priority boosting. Т.е. в Винде раз в 4-5 сек принудительно прерываются даже самые высокоприоритетные потоки, а управление отдается потокам, давно застрявшим в хвосте очереди. Одно из решений: иметь нормальный или чуть-чуть повышенный priority, а привязку ко времени делать банальным Sleep-ом (чтобы Винда не имела повода пропихивать убогие потоки вперед волюнтаристсткими методами, пускай естественным образом сами туда попадают, пока критический поток спит).

    З.Ы. Сто раз повторялось: Винда - не РТОС. :dntknw:
    З.З.Ы. Все ИМХО.