• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Проблема с Waitforsingleobject

  • Автор темы Hmarik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
H

Hmarik

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

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, то как раз "как минимум". Еще имеет значение то, как ты замеряешь время, какой приоритет у потока и много других вещей.

Есть ли какие функции или как можно заменить этот код, что можно было выстоять реально 1мс...
Нет, нету. Windows не является операционной системой реального времени.

Кстати Sleep(1) - тоже засыпает поток на 10-11мс ;-(
The Sleep function suspends the execution of the current thread for at least the specified interval.
 
H

Hmarik

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

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

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

zubr

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

Hmarik

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

Barmutik

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

Hmarik

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

Barmutik

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

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

Hmarik

timeSetEvent
Первоначальные тесты показали что получилось ;-)..
Спасибо
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!