Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

возвращаясь к задержкам ... [D6, Win95/98, WinXP]


Страницы:   1 2

Vallos ©   (2005-07-05 16:08:00) 

Возникла необходимость устанавливать задержку выполнения программы (и менее 1 мс). Вроде бы и хорошая реализация:

procedure Delay_(ms: double);
var
 x1, x2, freq: Int64;
begin
 QueryPerformanceFrequency(freq);
 QueryPerformanceCounter(x1);
 repeat
   QueryPerformanceCounter(x2)
 until (x2-x1 >= 0.001*ms*freq);
end;

Все четко и красиво работает (от мкс до с), единственное - когда все процессы на машине заморожены: стоит повести мышкой - четкость и красота пропадает ... RDTSC работает аналогичным образом ...
Вопрос в следующем: есть ли другие реализации без привязки к частоте процика (частота которого плавает и в 'спящем режиме') или чегото ещё...


begin...end   (2005-07-07 08:32:00) [1]

> Kerk ©   (06.07.05 16:06) [24]

"Жениться тебе надо, барин" (с)
:-)


alpet   (2005-07-07 08:21:00) [2]

Германн ©   (07.07.05 01:31) [31]
Собственно автору и нужны "извращения" :) Хотя бы потому что в MustDie, да еще и в user-mode. Что касается драйвера - не понял, для чего? Звук  частотой 1000 Гц можно сгенерировать и в SoundForge .


Германн   (2005-07-07 01:31:00) [3]

2 alpet ©   (06.07.05 16:35) [29]
Ну честно сказать - очередное "извращение". Попытка "применить неприменимое"!
Можно написать некий драйвер для звуковой карты. Но не лучше ли создать "внешнее устройство с АЦП и ЦАП" контроллируемое микропроцессором, а многие из них имеют встроенные АЦП и ЦАП!?


Digitman   (2005-07-06 16:44:00) [4]


> Vallos   (06.07.05 16:34) [28]


в пнринципе, если таки хочется поизвращаться, можно на короткие промежутки времени получить возможность поработать в риэл-тайм

пишешь драйвер режима ядра, в нем ты запрещаешь все прерывания (в т.ч. - немаскируемые) и, пока ты их вновь не разрешишь, ни один процесс и ни один трэд процесса не получит управления, пока ты вдоволь не натешишься "таймерами")


alpet   (2005-07-06 16:35:00) [5]

Как это можно сделать для WINDOWS (источник сигналов):
1. Потребуется звуковая карта.
2. Устанавливаем к примеру следующие параметры воспоизведения (можно через DirectSound):
"дискретизация: 22050гц, разрядность 8 бит, моно".
Это означает что выборка DAC звуковой карты будет осуществляться 22050 раз в секунду, а нам надо чтобы импульсы шли через 1 мс (иными словам 1000 гц писк). Из этого следует, что в буфере воспроизведения максимальные значения амплитуды с минимальным (255 и 0) чередовались через 11,25 выборок или такое же количество байт. Этот звук можно впринципе легко сгенерировать програмно, и после этого зациклить буфер на воспроизведение. Сигнал можно будет снимать через триггер с звукового выхода.
Для большей точности сооветственно выбирается большая частота дискретизации.

Если нужно принимать сигналы - соотвественно используется запись с линейного входа.


Vallos   (2005-07-06 16:34:00) [6]

... я предупреждал - Из нереального ...
... само-собой, что продолжительность действия должно быть меньше времени счета таймера ...
Не будем нагнетать обстановку, будем потихоньку расходиться  (буду просмотривать эту ветку, может что еще подскажите) ...
Благодарю всех за участие ...


Digitman   (2005-07-06 16:20:00) [7]


> ожидать отработки счета таймера


что ты, спрашивается, будешь "ожидать", если таймер "тикнет" раньше, чем ты "отработаешь свое действие" ?

ты же НЕ МОЖЕШЬ знать, сколько времени будет исполняться "твое действие" !


Digitman   (2005-07-06 16:18:00) [8]


> я наверное начинаю надоедать


эт точно)

тебе же сказали - среда у тебя МУЛЬТИЗАДАЧНАЯ !

а ты все про свой 8253 гнешь)


Vallos   (2005-07-06 16:10:00) [9]

... я наверное начинаю надоедать (, а модератор перенесет эту ветку в ПОТРЕПАТЬСЯ)...
Из нереального:
- в начальный момент записать в таймер задержку, обнулить, запустить;
- отработать свое действие (таймер считает);
- ожидать отработки счета таймера, при окончании запустить поновому, и так далее ...
Т.е. отработать действие не по окончании счета таймера, а во время счета ... // это по поводу 8253 ...


Kerk   (2005-07-06 16:06:00) [10]

Вот прохожу мимо ветки регулярно.. и постоянно сабж не в том смысле понимаю.. блин..


Digitman   (2005-07-06 15:58:00) [11]


> функция определения "текущего времени"


нет, а 8253-то к этому какое отношение имеет ?
8253 не занимается ни подсчетом, ни контролем, ни хранением "текущего времени", этоже не часы, это - таймер !


> можно всунуть Application.ProcessMessages для больших периодов


это еще зачем ?
ты аппаратурой собрался управлять в тек.трэде или свистки/звонки/картинки показывать капризному юзеру, чтобы не заснул, да за мышкой/клавой следить ?


Vallos   (2005-07-06 15:45:00) [12]


procedure
var
t1, t2: TFTime;
begin
t1:= GetTimeNew; //  функция определения "текущего времени"
//      выполняемое действие;
repeat
  t2:= GetTimeNow-t1;
// можно всунуть Application.ProcessMessages для больших периодов
until t2 >= mks;
end;

Вот что мне хотелось бы получить на выходе, чтобы обеспечивать задержку от 0.1 мкс


Digitman   (2005-07-06 15:12:00) [13]

определись сначала, что для тебя есть "текущее время" ..


Vallos   (2005-07-06 15:03:00) [14]

... не знаю ...
Так можно ли реализовать определение текущего времени не через TDateTime, а (допустим) возможностями 8253?


Digitman   (2005-07-06 14:55:00) [15]


> приоритет задачи получается архивысокий


какое отношение приоритет (процесса, трэда) имеет к программированию и возможностям 8253 ?


Vallos   (2005-07-06 14:45:00) [16]

А если вернуться к "независимому" системному таймеру 8253 (х)...
У него частота тактов 1193180 Гц (Джорджейн, Справочник программста ПК типа РС, ХТ и АТ), и каким-то макаром (не понял как) "задвижками" можно изменять интервал таймера (%?), но при этом нужно восстанавливать оригинальное значение задвижки после отработки задачи (приоритет задачи получается архивысокий) ... (муть)


Ботвин Дмитрий   (2005-07-06 13:00:00) [17]

Тогда это нереально в принципе. Можно помесетить код, выполняющий задержку на 1мс и менее в поток и присвоить ему
высокий приоритет. Или ещё лучше поместить его в критическую
секцию и пока он не выйдет из неё никто его не вытеснет. Но тогда процесс Expolorer, который и отвечает за отклик на действия юзера, просто не сможет запустить свои потоки и юзер
через некоторое время подумает, что его комп завис и нажмет
резет. Отсюда 2 варианта:
1. Сделать комп контроллером и не сажать за него юзера. Тогда
  можно и с потоками поэксперементировать.
2. Перейти на реал-тайм ОС(например дос), а вместо D6 -    
  TurboPascasl, а ещё лучше С++.
По-другому я думаю не получится - виндус не работает в режиме
реального времени с оборудованием, да ещё когда там юзер по-пустякам процессор отвлекает :-)))


alpet   (2005-07-06 12:56:00) [18]

Не по API это все. Программы прикладного режима и думать не должны от прямой работе с таймером. Если ваш CPU поддерживает инструкцию rdtsc - можно и ей воспользоватся для отмеряния промежутков времени, но при этом процесс должен будет работать практически монопольно - с максимальным приоритетом - мышь вообще лучше отключить во время эксплуатации.


Vallos   (2005-07-06 12:45:00) [19]

В том то и дело, что в интерактивном (если я правильно понимаю): контроллер запустился себе и трудится, а тем временем можно и пасьянс разложить (doom побегать), в Word-е покопаться и тп.


Ботвин Дмитрий   (2005-07-06 12:05:00) [20]

У тебя комп тока как контроллер внешнего устройства работает или
ещё в интерактивном режиме? От этого много зависит...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо