Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

icq: 216409213
По умолчанию

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

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

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

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

icq: 216409213
По умолчанию

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

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

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

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

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

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

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

PAG

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


07:00.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru