Проблема с Waitforsingleobject

Тема в разделе "MS Visual C++", создана пользователем Hmarik, 8 авг 2005.

Статус темы:
Закрыта.
  1. Hmarik

    Hmarik Гость

    Проблема с WaitForSingleObject...
    Код
    WaitForSingleObject(m_eventRead, 5);
    Теоретически должны вывалиться из функции как максимум через 5мс.. так вот получаеться что минимум у меня 10-11мс, и даже если поставить таймаут 1мс, все равно будет минимум 10-11мс.
    Есть ли какие функции или как можно заменить этот код, что можно было выстоять реально 1мс...
    Кстати Sleep(1) - тоже засыпает поток на 10-11мс ;-(
     
  2. zubr

    zubr Гость

    Попробуйте GetTickCount
     
  3. Guest

    Guest Гость

    <!--QuoteBegin-Hmarik+8:08:2005, 10:02 -->
    <span class="vbquote">(Hmarik @ 8:08:2005, 10:02 )</span><!--QuoteEBegin-->Проблема с WaitForSingleObject...
    Код
    WaitForSingleObject(m_eventRead, 5);
    Теоретически должны вывалиться из функции как максимум через 5мс.. так вот получаеться что минимум у меня 10-11мс, и даже если поставить таймаут 1мс, все равно будет минимум 10-11мс.[/quote]
    Выделенное жирным неверно. Если объект ядра не переходит в signaled state, то как раз "как минимум". Еще имеет значение то, как ты замеряешь время, какой приоритет у потока и много других вещей.

    Нет, нету. Windows не является операционной системой реального времени.

    The Sleep function suspends the execution of the current thread for at least the specified interval.
     
  4. Hmarik

    Hmarik Гость

    WaitForSingleObject(m_eventRead, 5);
    Подождите, как раз все таки как МАКСИМУМ. Если не сработает Ивент, то таймаут 5мс, значит теоретически, либо должен сработать Ивент в течении от 1 до 4мс, а если он не сработал, то через 5мс должны вывалиться по таймуту... т.е. все таки теоретически как МАКСИМУМ 5мс или раньше, а минимум это 0мс.
    Время замеряю с помощью QueryPerformanceCounter.

    Кстати в догонку GetCountTick - работает у меня с дискретностью опять же 10-11мс ;-(. А даже если бы оно и лучше работало?... как заснуть?.. в цикле проверять время? - это получиться 100% занятость процессора - такой вариант не годиться... ;-(

    Я конешна понимаю что Виндовс не являеться операционной системой реального времени, но неужели заснуть на 1мс это проблема ;-(. Нда.. надо думат как выкручиваться....
     
  5. zubr

    zubr Гость

    Вы ставите WaitForSingleObject на 5 мс, а не на infinite, так что с тем же успехом делайте задержку через 5 мс зацикливайте.
    Как получить 5 мс: на своем опыте, при разработке программатора для AVR-ов (там тоже надо было получать задержки в несколько мс), я создавал цикл с выполнением какой то простой операции, задавал какое то большое число циклов, чтобы он выполнялся несколько секунд, с помощью GetTickCount перед началом цикла и после, определял время одного цикла, затем устанавливал количество циклов в зависимости от нужного времени задержки. Да, и еще, делалось это в потоке с высоким приоритетом (иначе бессмысленно).
     
  6. Hmarik

    Hmarik Гость

    Получаеться 100% загрузка процессора - это не корректно ;-(...
    Вообще это нужно для работы с вшнешним устройством... поэтому наверное буду пробывать написать драйвер... может там все будет получше...
     
  7. Barmutik

    Barmutik Гость

    Как уже говорилось .. в общем случае.. не получится всегда обеспечить точное срабатывание такого условия .. Даже сли Вы выставите потоку приоритет TimeCritical и то есть шанс что задержка не всегда будет равна той что Вам требуется ... и драйвер тут не поможет ...
     
  8. Hmarik

    Hmarik Гость

    Драйвер наверняка поможет... через драйвера работает же множество устройст у которых точная синхронизация просто необходимость.
    А в моем случае, мне не обязательно именно точно 5мс... можно и 4 .. и 6.. и 10 пару раз, но 10мс постоянно - это для меня много у меня скорость передачи падает ;-)
     
  9. Barmutik

    Barmutik Гость

    Хммм.. и напирмер какие это устройства у которых точная синхронизация это 100% необходимость? Все устройства работают по принципу буферизации ...

    Если Вам нужна точно мелкими затратами ... используйте GetPerfomance Counter ... он точнее чем GetTickCount .. и крутите просто циклы ...
     
  10. corsair

    corsair Гость

    timeSetEvent
     
  11. Hmarik

    Hmarik Гость

    timeSetEvent
    Первоначальные тесты показали что получилось ;-)..
    Спасибо
     
Загрузка...
Похожие Темы - Проблема Waitforsingleobject
  1. AgniXRudra
    Ответов:
    2
    Просмотров:
    47
  2. Zloikaktus
    Ответов:
    0
    Просмотров:
    27
  3. c0de3r
    Ответов:
    5
    Просмотров:
    151
  4. DobermannTT
    Ответов:
    10
    Просмотров:
    157
  5. SoulPaladin
    Ответов:
    4
    Просмотров:
    143
Статус темы:
Закрыта.

Поделиться этой страницей