Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];

Вниз

Точный Timer нужен...   Найти похожие ветки 

 
Dennis S   (2003-05-06 17:31) [0]

Что можно использовать вмето TTimer, чтобы времянные промежутки между какими-либо событиями были одинаковы как на Pentium-II, так и на P-IV....
И пожалуйста кусочек кода - типа, как?


 
evvcom   (2003-05-06 17:45) [1]

А что TTimer разные промежутки времени выдает на этих машинах?
Разница, наверное, несколько десятитысячных секунды? Это тогда надо снять крышку компьютера и попробовать поискать где же там что-нибудь подкрутить?
Реально, код может не получить управление в ту же микросекунду, как придет сообщение от таймера. И с этим ничего не сделаешь, так работает ОС. И никто пока не жаловался, по-моему.


 
Verg   (2003-05-06 17:46) [2]

Точность-то какая нужна?
Win32 - платформа мультизадачная, НЕ реального времени.
Т.е., никаким образом поток не может гарантировать равность времени, потраченного процессором на выполнение данного, конкретного, одиного и того же участка его кода, хотя бы с точностью до времени работы обработчиков аппаратных прерываний, происходящих во время выполнения этого участка кода...


 
Mikelson   (2003-05-06 17:48) [3]

Можно использовать waitable timer
var
hT: Thandle;
begin
CreateWaitableTimer(nil, true, "");
repeat
SetWaitableTimer(hT, time, period, nil, nil, false);
if WaitForSingleObject(hT, INFINITE) = WAIT_OBJECT_0 then
do_smth;
until 2*2=5;
end;

Что-то в этом роде. Токо возвращаемые значения проверяй.


 
REA   (2003-05-06 17:50) [4]

Для чего? Какая точность нужна?


 
Dennis S   (2003-05-06 18:00) [5]

Конкретизирую:
Есть определеный комплекс операций, который выполняется по событию на Таймере...
Так вот, на П-4 это занимает, скажем, 4 сек., а на П-2 - время затраченное на выполнение данных операций вырастает где-то до 10-15 сек...

Я так понимаю, что Таймер привязан к частоте Процессора...
А мне надо, чтобы было так,что если процес должен идти 20 сек, то он должен идти именно 20 сек. на любой "машине"...

У меня на таймере: перемещение компонентов по форме...

==========
2 Mikelson
Это было именно то, о чем я тут спрашиваю...? :)


 
REA   (2003-05-06 18:05) [6]

Таймер не привязан к частоте.
События таймера обрабатываются по мере выборки сообщений из очереди.
Время обработки события должно быть меньше времени таймера, иначе событие не придет.
Для более точной работы нужно использовать параллельные процессы либо другие таймера.
Не нужно что либо критичное вешать на таймер.


 
Dennis S   (2003-05-06 18:07) [7]

А как тогда можно добиться выполнение требуемого другим способом?


 
Mikelson   (2003-05-06 18:08) [8]

2 Dennis S
Нет, но можно приспособить, хотя имхо не совсем тот случай.
Если у тебя длительные операции, выноси их обработку в отдельный поток(и).


 
Verg   (2003-05-06 18:23) [9]

Не понял чего собственно надо...
Есть подозрение, что это типа как распоковывать из MPEG кадры фильма. Если распаковка каждого кадра в отдельности на разных компьютерах выполняется за разное время, то частота смены кадров на дисплее должна быть строго определенной.
Я так понял задачу? Точнее аналогию?
Тогда точности таймера (TTimer, WaitableTaber или таймеры из MM System) вполне достаточно.
см.
MMRESULT timeSetEvent(

UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
DWORD dwUser,
UINT fuEvent
);


 
evvcom   (2003-05-07 00:13) [10]

> Так вот, на П-4 это занимает, скажем, 4 сек., а на П-2 -
> время затраченное на выполнение данных операций вырастает
> где-то до 10-15 сек...

Так может это время выполнения самих операций достаточно большое? P2 послабее машина, вот и тормозит, а таймер тут совсем не причем. Выводи время начала выполнения контрольных участков кода в лог-файл, и все станет ясно, кто виноват в такой разнице: таймер или сам код!


 
Dennis S   (2003-05-07 11:13) [11]

2 ALL
Процесс: перемещение(точнее сжатие-расжатие) ранели с 3 TImage на ней...
визуальный эффект: закрытия и открытия ворот гаража

На таймере выставлял период, чтобы на моей "машине" перемещалось плавно и шустро....а вот на другой проверил и "упал"...

Что еще скажите??? :)


 
ASMiD   (2003-05-07 11:26) [12]

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


 
circul   (2003-05-07 12:16) [13]

unit uTMTimer;

interface

uses
Classes,windows,mmSystem;

type
TMTimerCallBack = procedure;stdcall;

TTimerMM = class(TThread)
private
fTmId: Cardinal;
fInterval: int64;
fCallBack: TMTimerCallBack;
proc: procedure(uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD);stdcall;
protected
procedure Execute; override;
public
constructor Create(aInterval: Integer;CallBack: TMTimerCallBack);
destructor Destroy;override;
end;

implementation

uses sysutils;

procedure tCallBack(uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD);stdcall;
begin
if Assigned(TMTimerCallBack(dwUser)) then TMTimerCallBack(dwUser);
end;

destructor TTimerMM.Destroy;
begin
TimeKillEvent(fTmId);
inherited;
end;

constructor TTimerMM.Create(aInterval: Integer;CallBack: TMTimerCallBack);
begin
inherited Create(True);
FreeOnTerminate := True;
fInterval := aInterval;

proc := @tCallBack;
fCallBack := nil;

if Assigned(CallBack) then fCallBack := CallBack;

Resume;
end;

procedure TTimerMM.Execute;
begin
fTmId := timeSetEvent(finterval,0,@proc,Cardinal(@fCallBack),TIME_PERIODIC);
while not terminated do Sleep(1);
end;

end.

Функцию для CallBack можно таже определить для выполнения в потоке.


 
REA   (2003-05-07 12:21) [14]

Если оно не успевает, нужно увеличивать шаг отрисовки в ущерб плавности. Можно засечь на первом кадре время отрисовки и исходя из этого задавать таймер. Есть смысл соптимизировать саму отрисовку.


 
Dennis S   (2003-05-08 09:37) [15]

Всем спасибо...
Дело ясное, что дело темное :)
...теперь буду думать толи советом circul-а воспользоваться, толи оставить все как есть и пойти пить пиво...

;)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.007 c
1-70268
Filat
2003-05-12 12:05
2003.05.22
Подскажите, как правильно сделать вставку данных по маске?


14-70478
Barlok
2003-05-01 12:44
2003.05.22
Вопрос по методу Гауса?


14-70452
kaif
2003-04-29 14:39
2003.05.22
Жизнь садовника лучше.


14-70464
Hawk
2003-05-03 16:10
2003.05.22
Как залогиниться на www сайт, програмно.


14-70441
thing
2003-05-01 20:26
2003.05.22
Графика





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский