Цикл как в роли таймера

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

RadioHAM-433
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 28.10.2010 (Чт) 22:51

Цикл как в роли таймера

Сообщение RadioHAM-433 » 08.02.2011 (Вт) 14:35

Добрый всем день! Просьба не смеяться! Мне нужно получить частоту синхронизации 200-500 Гц что таймер не обеспечит да и это отдельный поток вообще. Я хочу применить цикл. А вот как слип то указать? Как в VB.6 я попробовал но такое не работает.
Подскажите уж кто знает буду очень признателен!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Цикл как в роли таймера

Сообщение iGrok » 08.02.2011 (Вт) 15:12

Идеальных 500Гц и даже 200Гц - никак не получишь. Максимум, около 60Гц, и то далеко не идеальные - частота будет часто сбиваться.
label:
cli
jmp label

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Цикл как в роли таймера

Сообщение Debugger » 08.02.2011 (Вт) 15:12

Вообще Sleep(1000/нужная частота).
Но у тебя же по этому "таймеру" какая-то функция будет выполняться, верно? И причём она будет выполняться какое-то ненулевое время. Предположим, 1мс. Тогда (для частоты 500Гц) выполнение программы будет выглядеть так:
Задержка 2мс
Выполнение 1мс
Задержка 2мс
Выполнение 1мс
Короче, ты получить не 500 выполнений в секунду, а меньше. И, сюрприз, так просто с этим не разобраться. Нужно использовать API queryperformancecounter/подобные.
Added:
iGrok писал(а):Идеальных 500Гц и даже 200Гц - никак не получишь. Максимум, около 60Гц, и то далеко не идеальные - частота будет часто сбиваться.

Да, точно.
queryperformancecounter - единственный выход.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Цикл как в роли таймера

Сообщение iGrok » 08.02.2011 (Вт) 15:21

Выход ли?
http://www.devdoc.ru/index.php/content/ ... ounter.htm

Это всё подходит для измерения времени. Для синхронизации тоже, если допустим "пропуск" моментов синхронизации, т.е. если нужна только привязка моментов к временным интервалам, но не обязательно чёткое следование моментов друг за другом.

А точную синхронизацию на такой частоте можно получить только железом, но не программно.
label:
cli
jmp label

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Цикл как в роли таймера

Сообщение Debugger » 08.02.2011 (Вт) 15:38

Теперь вопрос: как это сделать в .NET?

RadioHAM-433
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 28.10.2010 (Чт) 22:51

Re: Цикл как в роли таймера

Сообщение RadioHAM-433 » 08.02.2011 (Вт) 16:10

Но точно базовая точность частоты не так важна главное что бы она была стабильна и известна что бы сделать привязки по в времени: то есть в этой процедуре можно было учитывать время. Главное знать частоту и всё.
Процедура в ней цикл

Public Sub СинхронЯдра()

Цикл
Ядро()
повтор

End Sub

А по поводу выполнения всё проще. Нужно просто инициализировать процедуру что бы она могла проверять условия.
А на попытку вписать куда угодно Sleep(время) ругается.
А временная нестабильность тоже не важна, думаю что если на 10 с +/- 1с то нормально будет. Будет работать частотомер и будет корректироваться частота.

И синтаксис записи цикла со слипом подскажите тогда.
Так что это не часы а просто так сказать эмуляция постоянного (бездисретного) контроля что то такое. Данные изменились сразу отреагировать.
Так же не говорите про что а если за это время код не успеет выполниться это всё предусмотрено.
А про таймеры то я знаю я даже использую таймеры для контроля стабильности (слежение за частотой).
А базовая частота это только для контроля времени: скажем переуд выполнения 1 мс 10 выполнений значит 10 мс.
Так что только цикл которые бы мог инциализировать процедуру и всё больше не чего не надо.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Цикл как в роли таймера

Сообщение Debugger » 08.02.2011 (Вт) 16:42

RadioHAM-433 писал(а):Данные изменились

Так никто не делает.
В общем-то, это признак незнания чего-то/кривости архитектуры. Короче, опиши проблему подробнее, и мы тебе расскажем, как сделать круче.
Ну а пока:
Код: Выделить всё
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Const SleepTime = 50        '1000/(нужная частота). 50 - для 20Гц.
                            'Sleep не гарантирует точность для частот выше ~40Гц.
Const TimerStep = 0.05      'Вариант с Timer. Должен работать нормально на меньше ~15Гц.
                            'Этот вариант хорош тем, что если в эти 50мс входит время выполнения ядра.
...
    'Вариант A
    Do While True
        'Ядро
       
        'Задержка
        Sleep SleepTime
        DoEvents
    Loop
   
    'Вариант B
    Dim NextTime As Currency
    NextTime = Timer
    Do While True
        'Ядро
       
        'Задержка
        Do While Timer < NextTime
        Loop
        NextTime = Timer + TimerStep
        DoEvents
    Loop

RadioHAM-433
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 28.10.2010 (Чт) 22:51

Re: Цикл как в роли таймера

Сообщение RadioHAM-433 » 08.02.2011 (Вт) 16:53

Не подскажете однозначно как это решение не для простой программы. Это ядро согласовывает чисто логические данные, но а сели речь идёт о физических то и это сможет. Аналогичным методом я решал задачу кое где всё отлично работает автоматом. А подсказать как сделать круче в данном случае нельзя чисто по определению как мало данных о том даже как должно работать. Короче это сложные логические (интеллектуальные может так сказать) операции. Задача ядра видеть работу других алгоритмов и контроль их данных. Да всё отлично спс огромное я дальше работать больше не чего не требуется!
Вопросик а зачем DoEvents? Вот при значении 1 мс выдаёт 512-513 Гц всё норма, колебания в переделах 20-40 Гц не критичны.
Последний раз редактировалось RadioHAM-433 08.02.2011 (Вт) 17:11, всего редактировалось 1 раз.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Цикл как в роли таймера

Сообщение Debugger » 08.02.2011 (Вт) 17:09

А подсказать как сделать круче в данном случае нельзя чисто по определению как мало данных о том даже как должно работать. Короче это сложные логические операции.

Единственное, что более-менее понятно из твоего сообщения. Остальное - поток сознания в чистом виде. Перепиши.

Число путей решений стремится к бесконечности. Наиболее элегантный способ можно выбрать только после тщательного разбора условий задачи.
Ты же знаешь, что у тебя за задача. Расскажи нам о ней побольше.
Короче это сложные логические операции.

Зачем их выполнять с такой периодичностью? Такая необходимость может возникнуть только при написании какого-нибудь очень, очень специфичного. Вроде автоматического детектора влажности, который извещает пользователя, если влажность в комнате выше 50%. И то, там такие частоты не нужны.
Даже работа с нетривиальными внешними устройствами обходится без высокочастотного таймера. Даже работа с камерой (определение наличия объекта на изображении с веб-камеры) обходится без такого изврата.
Обычно подобные задачи - винтики в сложной программе. И, чтобы избежать лишних вопросов, вопрос ставится о частной реализации этого винтика ("Высшие Силы мне сказали, что мне нужен таймер с ~300Гц точностью. Как мне это сделать"?). И тебе говорят, как это сделать. Но тут абсолютно четко видно, что ты что-то делаешь не так. Тебе не нужен таймер.
Added:
Задача ядра видеть работу других алгоритмов и контроль их данных.

Тебе абсолютно точно не нужен таймер.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Цикл как в роли таймера

Сообщение FireFenix » 08.02.2011 (Вт) 17:17

По теме таймера: http://msdn.microsoft.com/ru-ru/library ... watch.aspx и никаких велосипедов
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

RadioHAM-433
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 28.10.2010 (Чт) 22:51

Re: Цикл как в роли таймера

Сообщение RadioHAM-433 » 08.02.2011 (Вт) 17:20

Эмуляция бездискретности! Но частота то еще не определена какая будет использоваться. Чем выше тем меньше будет дискретность относительно. Блин это алгоритмы цифрового разума. Я не такой програмист что бы придумывать низкоуровневые реализации. Нужен был язык максимально миним кода в котором. А по поводу как что да сейчас неизвестно потом в результате экспериментов думаю станет известно. Если я буду думать как тут на низком реализовать лучше я с логикой застряну.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Цикл как в роли таймера

Сообщение Joo » 08.02.2011 (Вт) 18:47

Debugger писал(а):Вообще Sleep(1000/нужная частота).
Но у тебя же по этому "таймеру" какая-то функция будет выполняться, верно?

Можно типа того
Код: Выделить всё
Цикл
ЗамерПродолжительностиСинхронизации
Синхронизация
Задержка (1000/Частота)-ПродолжительностьСинхронизации
Повтор
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

RadioHAM-433
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 28.10.2010 (Чт) 22:51

Re: Цикл как в роли таймера

Сообщение RadioHAM-433 » 08.02.2011 (Вт) 18:51

Всем спс вопрос решён всё отлично! Тему можно удалять или закрывать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Цикл как в роли таймера

Сообщение Хакер » 12.02.2011 (Сб) 23:19

Joo писал(а):
Debugger писал(а):Вообще Sleep(1000/нужная частота).
Но у тебя же по этому "таймеру" какая-то функция будет выполняться, верно?

Можно типа того
Код: Выделить всё
Цикл
ЗамерПродолжительностиСинхронизации
Синхронизация
Задержка (1000/Частота)-ПродолжительностьСинхронизации
Повтор


Вот где у дотнетчиков течёт абстракция. Они не знают, как работает Sleep и придумывают всякую чушь с нахождением фактора коррекции.
Sleep гарантирует, что поток проспит не менее X миллисекунд. Sleep никак не регламентирует, сколько на самом деле проспит поток. Sleep не гарантирует, что поток проспит примерно X миллисекунд, что поток проспит X с небольшим миллисекунд. Поток может проспать 1.1*X, может проспать 7*X, может проспать 1000*X. Как повезёт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Цикл как в роли таймера

Сообщение Joo » 13.02.2011 (Вс) 5:49

Хакер писал(а):Вот где у дотнетчиков течёт абстракция. Они не знают, как работает Sleep и придумывают всякую чушь с нахождением фактора коррекции.

Где ты увидел своим больным взглядом, что я писал о Sleep, скажи мне пожалуйста!

Хакер писал(а):Sleep гарантирует, что поток проспит не менее X миллисекунд.......Поток может проспать 1.1*X, может проспать 7*X, может проспать 1000*X. Как повезёт.

Я без тебя прекрасно знаю как работает Sleep, так что не чего нового ты не поведал, извини.

p.s. Какого фига тебя вообще занесло в .NET, ладно занесло, так и еще и писать вздумал в этом "отвратительном" разделе? Опускаешься....
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList