![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| profesiachuvak |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Друзья, не смог найти на форуме ответ, поэтому пишу этот детский вопрос.
Вопрос: Как я понял в функцию sleep(); засунуть дробное значения я не в силах. Как это можно обойти? -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
profesiachuvak, дробное - это какое? Там идет время в мс., Вам нужно еще мельче?
|
|||
|
||||
| profesiachuvak |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Да мне нужно ещё мельче.
То есть мне нужно не то чтобы мельче или больше, просто диапазон изменяемых значений у меня должен быть большим. То есть использовать задержку вплоть до сотых? Дело в том, что с помощью то или иной задержки у меня изменяет частота выдаваемая с LPT порта. И там мне необходимо много вариаций. -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
profesiachuvak, еще разок: какой диапазон и шаг изменения?
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Дело в том, что винда переключает потоки и выделяет кванты времени по 10мс, так что точность 1мс не гарантируется. Пока программа владеет процом и не переключается в режим ядра, еще можно говорить о точности, но такое удовольствие длиться недолго, и по-любому происходят прерывания. Что-то более менее на точность можно получить в режиме ядра, да и то при определенных условиях.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
profesiachuvak, для такой точности ни винда ни делфи не подходят.
нужно ОС реального времени -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| profesiachuvak |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Диапазон частоты от 0 до как можно больше кГц. Шаг хотелось бы хотя бы 0.1. Неужели добиться точности меньше чем 1 мс невозможно??? Добавлено через 3 минуты и 27 секунд
Alexeis Что за режим ядра? Добавлено через 7 минут и 47 секунд
Frees Что значит ОС реального времени, и какие его представители*? -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
||||||
|
|||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Интернет ещё не отменили: http://ru.wikipedia.org/wiki/ОСРВ -------------------- |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Нулевое кольцо, это привилегированный режим. Там можно получить исключительно высокий приоритет, так что прерывать будет разве что системный таймер. Но в принципе, на короткие промежутки времени можно вообще запретить прерывания. Где-то встречалось на просторах инета мод windows 2000 позволяющий ей работать как система реального времени. Задачи реального времени обслуживал специальный драйвер, который как раз и работал в нулевом кольце. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| source777 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Из-за этого минимальный интервал времени, не приводящий к накоплению погрешности, равен 125 мс. Даже если поставить в цикле вызов Sleep(10), то уже через пару тысяч итераций набежит довольно большая погрешность. Да, в 3-ем кольце, в котором работают все обычные программы под Windows, невозможно добиться точности для временных интервалов, не кратных 125 мс.
Это сообщение отредактировал(а) source777 - 29.11.2009, 19:30 -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||
|
|||||
| profesiachuvak |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Спасибо, source777, Ваш ответ наиболее исчерпывающий. Благодарю всех, теперь вопросов стало ещё больше -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
|||
|
||||
| 1000000dollars |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 6.10.2007 Репутация: нет Всего: 8 |
Можно попробовать пошаманить с клоками процессора. Возможно удастся получить желаемую точность.
|
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Конечно не хорошо delay делать кодом, но в твоём случае может и пойдёт:
1. Встроенный asm: rdtsc 2. WinAPI: QueryPerformanceCounter и QueryPerformanceFrequency Оба способа позволяют измерять время между двумя точками в программе(с точностью до наносекунд, т.к. измеряют такты процессора), если поизвращаться, то можно использовать как "таймер", только не забудь своей программе приоритет повыше поставить, чтобы Windows не могла на другие пользовательские программы переключаться во время работы твоей. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Разве это не тики 3х мегагецового таймера? Насколько я знаю, там точность подрядка 0,5 мкс. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Честно говоря, в этот вопрос я не углублялся. Но примеры с точностью до 1 мкс где-то видел, а этого топикстартеру за глаза должно хватить... Кстати, как раз QueryPerformanceFrequency должна возвращать частоту этого таймера... у кого есть винда под рукой, проверьте какой порядок этого значения... -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| profesiachuvak |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Прочитал Ваши советы по поводу RDTSC. Заинтересовало, решил испробовать. Не совсем порнятно как теперь с этой функций работать:
К примеру посмотреть за которое время проходит цикл? И что за результат возвращает фукция? Кол-во тактов? Добавлено @ 18:41
source777, Вы имеете ввиду что-то вроде этого ?
Это сообщение отредактировал(а) profesiachuvak - 30.11.2009, 18:42 -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
||||||
|
|||||||
| source777 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Нечто похожее, я на Delphi уже года 2 ничего не писал, так что с конкретным кодом сам разберёшься, главное идея.
Лучше с WinAPI начни. Я имею в виду что-то типа такого:
GetDeltaTimeInMicroseconds будет с помощью QueryPerformanceCounter считать время между полезными итерациями. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||
|
|||||
| profesiachuvak |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Что ж разобрался с QueryPerformanceFrequency и QueryPerformanceCounter. Довольно удобный счётчик. Реализовал его я так :
Спасибо Вам (в частности source777) за совет насчет WinApi. Вот только теперь возник новый вопрос : И как же я смогу с помощью этого таймера сделать задержку примерно в 1 мкс? Это сообщение отредактировал(а) profesiachuvak - 3.12.2009, 13:58 -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
||||||
|
|||||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
почему деление на 4?
1) Я ж тебе уже описал алгоритм на псевдокоде, куда уж подробнее? 2) Помнится тебе нужно было 100 мкс Это сообщение отредактировал(а) source777 - 3.12.2009, 18:46 -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| profesiachuvak |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
В темке где было написано про работу QueryPerfomanceCounter была строчка :
Как я понял это четвёртая часть числа, просто в такой записи у меня не работает. (t1/4 работает и результат выводит правильно) Добавлено через 5 минут и 36 секунд
source777, я прошу прощения за то что прошу всё разжевать, но можешь немного прокомментировать свой псевдокод? Например мне не совсем понятна вот эта строчка :
Остальное вроде понятно. Впринципе мне сойдёт задержка и в 100 мкс, но я думаю если Вы мне объясните эту строчку у меня получится сделать и 1 мкс. -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
||||||||
|
|||||||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
А что конкретно непонятно в этой строчке? Просто я не знаю с какой точностью у тебя получится определять задержку в микросекундах, поэтому там и поставлено условие для точности +/- 4 мкс и задержки 100 мкс, числа в этой строке чисто для примера, можешь менять их эмпирическим путём.
вообще-то это обращение к union типу LARGE_INTEGER из C++... В Delphi в сигнатуре этого метода скорее всего значится Int64, так как union в Delphi не поддерживаются, поэтому делить ни на что не надо. P.S. Кстати, какое значение выдаёт функция QueryPerformanceFrequency? -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| kuzyara |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 215 Регистрация: 13.11.2006 Репутация: нет Всего: 1 |
а зачем изобретать велосипед?
--------------------
подпись |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
А слабо привести ссылку на готовое, юзабельное решение для сверхточного таймера, а не на сборку статей с описанием велосипедов, половина из которых вообще даже близко не соответствует условию поставленной задачи, а в оставшейся половине статей(вместе взятых) полезной информации не больше, чем в этой теме? -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| profesiachuvak |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Насчёт этого деления на 4 : Вот к примеру тот код который я приводил для работы с таймером, только в середину я вставил слип на 1000 мс (1сек) :
Ответ в секундах = 0,999657498369206 QueryPerformanceFrequency(t1); возвращает значение = 3579545 Теперь я убрал деление на 4 ответ всё тот же, Вы правы оно собственно ни к чему. На счёт вашего псевдокода: как я понял задержку мне придётся делать только с помощью цикла? Честно говоря я не совсем понимаю суть. У меня есть цикл, в котором выполняется предположим одна функция:
Ну никак моя голова не может понять, как мне грамотно использовать таймер, который я написал, чтобы это сделать. -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
||||||
|
|||||||
| source777 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
да, забудь про `for i:=1 to 10 do` и юзай бесконечный while + break по счётчику полезных итераций.
Ну мало ли что кому надо... Ты ограничен в своих желаниях особенностями архитектуры используемой ОС. А когда речь идёт о микросекундах, время на выполнение твоей полезной функции должно также учитываться.
Ну вот, значит для твоего компьютера максимальная точность будет 0,279 мкс и надо выбирать интервалы близкие к кратным этому. Не мудрено, ты же и частоту и время на 4 делил и в итоговом вычислении TimeElapsed все четвёрки сокращались, так что без них результат должен быть чуточку точнее. лучше тестировать на sleep(125); или sleep(250); т.к. большие интервалы времени sleep обрабатывает также неточно как и маленькие. Это сообщение отредактировал(а) source777 - 7.12.2009, 16:30 -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||||
|
|||||||
| kuzyara |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 215 Регистрация: 13.11.2006 Репутация: нет Всего: 1 |
Ссылку я привёл, и, если не ошибаюсь, то топикастеру нужен сверхточный таймер. Вот первый пример по теме. Угадай, откуда? Там ещё есть многофункциональные модули... А обладателю лучей поноса выше рекомендую воздержаться от такого тона, а то доведёшь до баттхерта...
--------------------
подпись |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
и чем же приведённые там велосипеды заслужили статус готового, юзабельного решения? Ты хоть один из них пытался использовать в реальном, современном приложении? Сам подход выставления задержки между вызовами собственной процедуры уже в корне не верен, когда нужна большая точность, так что о юзабельности примеров из той статьи можно говорить только в теории... эта строчка явно повысит точность, для этого ж только деления нацело на мульён и не хватало... P.S. И воздержись от перехода на личности, пока ограничусь устным предупреждением. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| kuzyara |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 215 Регистрация: 13.11.2006 Репутация: нет Всего: 1 |
"Единственным методом определения быстродействия кода должно быть его выполнение. И только." (С) Джулиан Бакнелл
Автор кагбэ намекает... Добавлено через 9 минут и 38 секунд Это сообщение отредактировал(а) kuzyara - 7.12.2009, 19:34 --------------------
подпись |
|||
|
||||
| profesiachuvak |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 7.11.2009 Где: Беларусь, Минск Репутация: нет Всего: 4 |
Ребят, спасибо за помощь.
Вывод к которому я пришёл: Первоначально, проблема вставшая передо мной казалось вполне выполнимой, казалось бы что может быть проще простейшей задержки на доли секунды. Оказалось что из-за архитектуры Windows (её замысловатые кольца приоритета), кроме того как написать нечто похожее на сверхточный таймер использую возможности процессора мы не в состоянии. Для меня даже удивление что sleep(); не может работать точно. Видно я ещё слишком мало знаю. Вообщем я пришёл к выводу, что для выполнения моей желаемой задержки, я должен использовать бесконечный цикл (со счётчиком полезных итераций)+ учитывать выполнение процедуры. Что ж если я понял правильно, то тогда пошёл пробовать писать. З.Ы. Спасибо, source777. -------------------- Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |