Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];




Вниз

Не могу получить от таймера интервал 20 мс 


artog   (2001-10-04 07:56) [0]

Доброго всем времени суток.
Мне необходимо выводить определенный байт в COM порт
с периодом в 20 милисекунд. Бросаю на форму таймер:

//Вызывается каждые 20 мс
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
SendByte(mybyte); //посылает байт в COM порт
Timer1.Enabled := true;
end;

Байт выводится, но минимальный период между байтами
получается 45 мс при любых установках таймера меньших 45 мс.
(Проверял осциллографом)
Может кто подскажет как решить данную проблему?
Программа тестировалась на 3 различных компьютерах:
от P - 100 до P II - 800.



Mbo   (2001-10-04 09:15) [1]

Системный таймер Windows считает с частотой 18 герц (55 мс).
Надо использовать какой- нибудь мультимедийный или поищи
High Resolution Timer (их много, используют обычно такты процессора)



AKV   (2001-10-04 09:48) [2]

1. Вроде на торри был компонент-таймер позволяющий бить до 1мс
2. Используя АПИ функции:
- QueryPerformanceCounter (текущее значение high-precision counter)
- QueryPerformanceFrequency (частота high-precision counter)
можно реализовать отдельный thread тогда периодичность счета пойдет на дцать мкс

P.s:Если сам не допрешь могу поискать где то валялся компонент реализованный на: QueryPerformanceCounter и QueryPerformanceFrequency

Це усе.







Delphimun   (2001-10-04 11:29) [3]

Можно попробовать вместо таймера написать две процедуры:
procedure tform1.a;
begin
SendByte(mybyte);
b;
end;
procedure tform1.b;
begin
sleep(19);
a;
end;
end.
Хоть и будет небольшая погрешность, но почти точно!



Ol   (2001-10-04 11:34) [4]

Я работал с таймером и добивался вызова события таймера и через 10 мс.
Но проблема в том, что выдержать заданный интервал с точностью до мс
ты не сможешь!!!!!



Dmitri   (2001-10-04 12:00) [5]

По поводу АПИ QueryPerformanceCounter / QueryPerformanceFrequency:
под NT точность порядка 1 мкс (используется стандартный программируемый таймер PC), но это для замера.

используя асм, померять с 1милисек время выполнения некоторой функции в Delphi:
function GetTicks: Int64; register;
asm
dw 310Fh
end;

и ещё может понадобится:
http://www.prodelphi.de/indexpd.htm
ProDelphi and ProKylix are tools to measure the runtime of programs written in Delphi/Kylix Object Pascal. First successful industrial usage of ProDelphi was in February 1998. Since then ProDelphi has been permanently improved, also customer ideas were integrated. ProKylix is the Kylix version of ProDelphi.
The principle of source instrumenting, the sophisticated measurement correction algorithym and the granularity of 1 CPU-cycle guarantee an outstanding measurement accuracy. Even very small or multiple nested functions are measured precisely...



AKV   (2001-10-04 14:15) [6]

Создается Thread
в котором:
1. постоянно замеряется текущее состояние Perfomance Counter
2. сравнивается с состоянием на момент последнего вызова требуемой процедуры,
3. получаем разницу счетчика если превысила требуемый интервал то
- либо из под самого threada делаем наше грязное дело
- либо посылаем собственное сообщение окну WM_HREN_C_MASLOM и обрабатываем его
- либо вызываем требуемую процедуру из threada
4. Фиксируем вызов и сначала

Я примерно таким образом управлял графопостроителем 75 года выпуска подключенным к LPT причем приходилось изменять частоту управления
в пределах от 200 6000 Гц для реализации частотного управления шаговыми
двигателями оного на D3, под W95,W98 + sea of Beer



AKV   (2001-10-04 15:14) [7]

Я конечно кррайне сорри но нашел я енто в торри:

http://www.carlosb.com/downloads/thdtimer.zip
Components>Date and Time>Timers
Threaded Timer v.1.2a FWS 6 Kb 26 Jan 2001
By Carlos Barbosa. This component has the same functionality of the default Timer component, but it provides a real resolution of 1 milisecond.
Fully functional
Source: Included


Download: D2 D3 D4 D5


Сам не смотрел



artog   (2001-10-05 19:12) [8]

Всем огромное спасибо за помощь!



Таймер   (2001-10-06 02:19) [9]

2 Ol
Я тебя, конечно пряздрявляю, но сомневаюсь, что енто ты " добился" "и через 10 мс". Енто NT добился, а не ты.



Wizard_Ex   (2001-10-06 12:45) [10]

Под NT системный таймер гораздо точнее.
если 50 мс то 50 мс и будет, а под Win9X эти 50 мс реально могут растянуться на сто, а то и 200 мс, зависит от скорости железа, от загруженности системы



Таймер   (2001-10-07 04:02) [11]

Моя не знает про Винтукей. Моя знает про 9х и NT Но и на NT моя может расстянуться на NNN мс. Особливо если некоторые другие захотят Real_Time.



Anatoly Podgoretsky   (2001-10-07 13:08) [12]

Это и на RealTime системах не будет, если приоритет низкий, то управление можешь получить немного после.




Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.014 c
7-66374           nikkie                2001-08-09 15:52  2002.01.21  
fax software


1-66296           kay                   2002-01-04 22:11  2002.01.21  
память


4-66388           YUS                   2001-11-18 19:07  2002.01.21  
SetWindowsHookEx


7-66383           Dmitry V. Averuanov   2001-10-04 11:35  2002.01.21  
Не удается передать Tbitmap в качестве параметра...


14-66344          AleksK                2001-11-25 14:07  2002.01.21  
WINAMP на Delphi