Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2018, 12:19   #1
PAG
Пользователь
 
Регистрация: 07.04.2016
Сообщений: 16
По умолчанию Как выдержать точный временной интервал в Win7?

Есть задача: посылать в порт (COM/FTDI) пакеты данных с заданным интервалом от единиц до десятков миллисекунд.
Реализована через системную функцию Sleep() и хорошо работает под WinXP.
Но при переносе на Win7 все нарушается.
Вместо 5 мс делает 2,8..3,8 мс. Вместо 50 имеем 33..38 мс и тд.
Получатель не дает квитирования, но имеет небольшой буфер, который в WinXP справляется, а под Win7 захлебывается.
А надо, чтобы приложения работало как на компах под ХР, так и под семеркой.
Есть у кого проверенные решения или полезные соображения?
PAG вне форума Ответить с цитированием
Старый 06.02.2018, 12:42   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Как выдержать точный временной интервал в Win7?
Никак. Винда не система реального времени.

Цитата:
Реализована через системную функцию Sleep() и хорошо работает под WinXP.
Но при переносе на Win7 все нарушается.
Вместо 5 мс делает 2,8..3,8 мс. Вместо 50 имеем 33..38 мс и тд.
Почитайте https://habrahabr.ru/post/319402/
p51x на форуме Ответить с цитированием
Старый 06.02.2018, 14:59   #3
PAG
Пользователь
 
Регистрация: 07.04.2016
Сообщений: 16
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Никак. Винда не система реального времени.
Но тем не менее в WinXP все работает корректно, а в семерке - нет.
Реально нет альтернативы?
А SetWaitableTimer() тоже не будет давать эффекта?
PAG вне форума Ответить с цитированием
Старый 06.02.2018, 15:22   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от PAG Посмотреть сообщение
Реально нет альтернативы
Вы ссылку читали?
waleri вне форума Ответить с цитированием
Старый 06.02.2018, 15:24   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Но тем не менее в WinXP все работает корректно, а в семерке - нет.
Не корректно, а у железка успевала прожевать. Проблема у вас не в точности таймера, а в том, что квант уменьшился и таймер стал чуть по другому работать.

Увеличьте ваши слипы в 2 раза и попробуйте.
p51x на форуме Ответить с цитированием
Старый 06.02.2018, 22:13   #6
SysCoder
Заблокирован
 
Регистрация: 20.07.2017
Сообщений: 2
По умолчанию

Задержку можно создать функцией NtDelayExecution из ntdll.dll, она по круче Sleep.
Про таймеры:
Из прецизионных таймеров есть уже готовый timeSetEvent из winmm.dll.
А самый точный таймер можно слепить самому (QueryPerformanceFrequency - сначала частоту таймера на данном железе узнаем) потом через QueryPerformanceCounter измеряем интервал в тиках. Это можно поместить в отдельный поток и задать ему хоть RealTime приоритет.
Если двигаться ниже к асемблеру - там есть команда rtdsc, ей можно замерять производительность даже отдельных машинных кодов.
SysCoder вне форума Ответить с цитированием
Старый 06.02.2018, 23:42   #7
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

И всё равно нельзя гарантировать, что именно в этот момент системе не захочется сбросить какие-то страницы в файл подкачки либо ещё как-то отвлечься
Black Fregat вне форума Ответить с цитированием
Старый 07.02.2018, 00:58   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
всё равно нельзя гарантировать
Можно присвоить потоку real-time приоритет.
Такие потоки не прерываются, пока они сами не соизволят вернуть управление.
Не панацея, но в большинстве случаев хватает.
waleri вне форума Ответить с цитированием
Старый 07.02.2018, 06:48   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

p51x
Пробежался по вашей статье. С выводами автора я несогласен. Тем более он пишет про win 8 которую я нетестировал.
В win7 никаких 0.5 мс нету.

Black Fregat
Цитата:
Сообщение от Black Fregat Посмотреть сообщение
И всё равно нельзя гарантировать, что именно в этот момент системе не захочется сбросить какие-то страницы в файл подкачки либо ещё как-то отвлечься
Систему можно промерить. В винде есть куча счётчиков. Как бы у меня по замерам на одних системах потеря времени стабильно не привышают 10 мс на других 125 мс. (Это зависит от процессора)
Сброс страниц происходит редко. В спокойном состоянии около 1 страницы в минуту.
Так что с долей успеха 50 мс вполне можно получить.
Только от sleep надо отказаться, а использовать цикл.

PAG

Но вот если хотите меньше, то надо ставить микроконтроллёр, который будет играть роль буфера. Буфер рассчитывайте на 1 секунду задержки. А ещё лучше если он сам будет генерировать нужные данные/сигналы.
Тем более контроллёры дешовые по 1-2 доллара.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 07.02.2018 в 07:11.
Pavia вне форума Ответить с цитированием
Старый 07.02.2018, 08:12   #10
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Пробежался по вашей статье. С выводами автора я несогласен. Тем более он пишет про win 8 которую я не тестировал.
То, есть Вы делаете выводы о статье не имея собственного представления о платформе на основе которой она написана?
Streletz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задать временной интервал в php grundik1 PHP 2 25.04.2015 16:58
Как правильно выдержать html и php. Predator199 PHP 14 07.03.2012 21:11
Временной интервал MaRKer.nsk Общие вопросы C/C++ 2 03.11.2010 10:04
Как получить точный таймер WaxeP Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 25.07.2010 18:25
Как реализовать точный таймер (до мксек) evgengold Общие вопросы Delphi 11 03.03.2009 11:41