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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2008, 12:48   #11
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Ребята, QueryPerformanceCounter и всякие высокоточные таймеры - это конечно хорошо, но вы не учитываете две вещи:

1. Windows - система многозадачная, процессор(ы) - ресурс ограниченный. Различные потоки конкурируют за этот ресурс, а планировщик Windows управляет кому и когда отдать квант процессорного времени, при этом остальные потоки будут мирно ждать своей очереди. Вы не можете из программы прямо управлять планировщиком (только косвенно путем выставления приоритетов) и не знаете, когда у вашего потока заберут квант. Может получиться, что нужный интервал в 0,1 мс растянется на неопределенно долгое время.
2. Работа с портами (автору нужно отправлять запросы на порт) в Windows осуществляется также, как и с файлами - через драйверы файловых систем. Все запросы таким драйверам асинхронны по определению (даже если вызвать функцию ввода/вывода в синхронном режиме), т.е. мы просто кладем в некую очередь запрос на операцию, которая будет выполнена когда-нибудь кем-нибудь. При синхронном вызове функция просто дожидается окончания асинхронной операции. Когда операция будет выполнена - также определяет планировщик.
Ins вне форума Ответить с цитированием
Старый 05.01.2008, 13:25   #12
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Согласен с Ins и исходя из его цитаты, Вам прийдется заниматься пайкой схемы для управления двигателем (как я понял) и через программатор делать с ним все что хатиш, задавать время с точностью до 1нс. А из винды врядли получиться сотворить такое.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 05.01.2008, 21:43   #13
chingiz
Пользователь Подтвердите свой е-майл
 
Аватар для chingiz
 
Регистрация: 21.05.2007
Сообщений: 88
По умолчанию

Обидно все таки - неужели ничего нельзя сделать. Программа уже почти готова, в смысле интерфейса, расчетов и т.д. и столько времени затрачено впустую? Когда начинал писать прогу даже не думал что на последнем этапе вылезет такая подлянка. Железо для управления есть,программа управления тоже есть и все прекрасно работает НО! в DOSe. Поэтому и занялся прогой под винду, просто чтоб интерфейс покруче был. Кстати пробовал в DOS на паскале функцию Delay - такая же ерунда как с таймером в дельфи. Под DOS прогу писал не я, даже не знаю остались исходники или нет надо поискать, но точно знаю что интервал времени задается замедлением системного таймера. Как насчет замедления системного таймера в Винде - возможно такое и что из этого получится? (Старая программа отлично работает под виндой в консольном варианте)
Уже Чему-то научился Но этого мало
chingiz вне форума Ответить с цитированием
Старый 05.01.2008, 22:05   #14
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Можно попробовать снести винду и работать с прогой чисто из ДОСА (т.к. однозадачный). Ну это как вариант... жаль просто твою работу и время. и лучьше взять старенькое железо, чет типа Пня 1 и пробовать.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 05.01.2008, 22:10   #15
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Притом у Вас уже есть прога которая работает хорошо из доса, к черту интерфейс, главное - результат.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 05.01.2008, 22:14   #16
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Цитата:
такая же ерунда как с таймером в дельфи.
Дельфи тут ни причем. Это ограничение системы. Почему это происходит? Прежде всего нужно понять чему равен минимальный период срабатывания юзер-таймера (тот самый, надстройкой над которым является компонент TTimer). В документации пишут, что даже если установить период срабатывания таймера 1 мс, то на Win9x реальный период срабатывания будет не менее 55 мс, а на NT - 10 мс. То же относится и к функции Sleep, WaitForSingleObject и другим функциям, работающим с временными интервалами. И вот почему (упрощенно):
1. Существует некий аппаратный таймер, тикающий с частотой 55 мс (10 на NT).
2. Получив прерывание от этого таймера, управление получает планировщик потоков.
3. Планировщик потоков выполняет действия по диспетчеризации потоков. Например, если истек квант выполняющегося потока, планировщик передает управление другому. Если один из потоков вызвал Sleep, тем самым исключив себя из числа планируемых на определенный период, то планировщик уменьшает время ожидания, и если оно истекло - снова ставит поток в очередь планируемых. И наконец, если поток установил таймер, также проверяет, истек ли его период, и если да - генерирует сообщение WM_TIMER. Так как планировщик получает управление не чаще чем 55 (10) мс, то он не сможет соблюсти меньший период для таймеров.
4. Очевидно, что сообщение WM_TIMER кладется в очередь не чаще чем 55 (10) мс. Но и это не есть точное время срабатывания таймера. Сообщение будет обработано не сразу, а с некоторой задержкой во-первых потому, что положить сообщение в очередь - не есть сразу его обработать. Оно будет обработано лишь тогда, когда поток вызовет GetMessage или PeekMessage (а ведь в этот момент поток может быть занят чем-то другим или вообще квант будет принадлежать не ему) и направит его оконной функции. Более того, сообщение WM_TIMER имеет самый низкий приоритет (обрабатывается в последнюю очередь, если в очереди сообщений имеются другие) а также, если в очереди уже лежит WM_TIMER, новое сообщение не кладется.

Из этого всего вывод, что юзер-таймеры Windows не обеспечивают точный период срабатывания, и погрешность тем больше, чем меньше период и чем выше нагрузка на процессор.

Цитата:
Как насчет замедления системного таймера в Винде
Считайте что никак. Во-первых, прямого доступа к портам таймера (в прочем, как и к любым другим) в 3-м кольце нет, без драйвера тут не отделаешься. Во-вторых, это может привести если не к краху системы, то точно к ее нестабильной работе. Дело в том, что тот самый планировщик как раз получает управление по прерыванию от системного таймера (которой как раз на 10 мс и запрограммирован). Так вот, уменьшив этот период, мы изменим квант выделяющийся потокам, у них останется меньше времени на работу, так как очень часто будет вклиниваться планировщик. За последствия - не ручаюсь

PS: А что вы с такой частотой слать хотите и на какой порт, коли не секрет?

Последний раз редактировалось Ins; 05.01.2008 в 22:21.
Ins вне форума Ответить с цитированием
Старый 05.01.2008, 22:19   #17
chingiz
Пользователь Подтвердите свой е-майл
 
Аватар для chingiz
 
Регистрация: 21.05.2007
Сообщений: 88
По умолчанию

Цитата:
Сообщение от SunKnight Посмотреть сообщение
Притом у Вас уже есть прога которая работает хорошо из доса, к черту интерфейс, главное - результат.
Так то оно так но все таки хотелось бы под винду. К томуже в старой проге надо кое чего добавить, а если исходники не найду, то все с нуля но уже для ДОСа.
Уже Чему-то научился Но этого мало
chingiz вне форума Ответить с цитированием
Старый 05.01.2008, 22:25   #18
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

chingiz, а что вы хотели? Система реального времени и многозадачность - это две вещи взаимно исключающие друг друга. Либо у нас много задач, между которыми нужно делить процессорное время, либо у нас одна но очень важная задача, у которой никто процессорное время отнять не может и она будет делать что хочет и когда захочет, никто ее не прервет.
Ins вне форума Ответить с цитированием
Старый 05.01.2008, 22:33   #19
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

CHINGIZ, я живу в городе машиностроителей и немного знаю обо всей этой каше. Для управления на заводах станками используют не проги из под винды (это просто смешто). Я приведу свои аргументы против:
- у тя нет проги под винду
- если захочеш запатентовать или продать проэкт, прийдется повозится с лицензией винды
- многозадачность винды проявляется в том что она выполняет задачу и в это же время тупит

P.S. под ДОС прогу интерфейс "забацать" тоже можно
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 05.01.2008, 22:48   #20
chingiz
Пользователь Подтвердите свой е-майл
 
Аватар для chingiz
 
Регистрация: 21.05.2007
Сообщений: 88
По умолчанию

Цитата:
Сообщение от Ins Посмотреть сообщение
chingiz, а что вы хотели? Система реального времени и многозадачность - это две вещи взаимно исключающие друг друга. Либо у нас много задач, между которыми нужно делить процессорное время, либо у нас одна но очень важная задача, у которой никто процессорное время отнять не может и она будет делать что хочет и когда захочет, никто ее не прервет.
1) Почему же тогда ДОСовская прога нормально работает под виндой из консоли? Правда не пробовал что будет если паралельно запустить другую задачу.

2) Программа управляет станком с ЧПУ. На данном этапе нужно обеспечить перемещение стола станка с максимальной скоростью 600 мм/мин а это при имеющемся типе двигателя 60000 управляющих импульсов/минуту на управляющую схему привода, или 1000 импульсов в секунду. Все это передается через LPT.
Уже Чему-то научился Но этого мало
chingiz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение функции nikleb JavaScript, Ajax 7 10.08.2008 01:49
указатель мыши автоматически должен совершать клик по заданному месту на экране, через промежуток времени Deefrost Qt и кроссплатформенное программирование С/С++ 5 16.05.2008 20:25
Как зделать авто выполнение Editor Общие вопросы Delphi 5 27.04.2008 21:01
Выполнение действия с компонентами в цикле Ermiss Общие вопросы Delphi 4 01.11.2007 23:54
Выполнение действия в заданное время WOWan234 Помощь студентам 6 02.05.2007 01:52