Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

Параллельные действия и TTimer   Найти похожие ветки 

 
Юра   (2002-12-05 11:33) [0]

Есть программа, которая делает следующее: по событиям OnTimer нескольких таймеров в обработчиках их что-то происходит (не важно, что именно). Как обеспечить точное срабатывание таймеров и распределение приоритетов? Как я понимаю, во время обработки обработчика N-го таймера вызов других обработчиков не происходит.
Если я выделю каждому таймеру свой поток - получу ли я точность в соблюдении временных интервалов (т.е. если у таймера стоит период в 10мс, то строго каждые 10мс вызывается обработчик таймера)? Что вообще можно почитать на эту тему - не о создании многопоточного приложения вообще, а о точности событий, привязанных ко времени в этом приложении.
Возможно, от использования TTimer вообще стоит отказаться и написать нечто типа централизованного диспетчера, который сам вычисляет время и распределяет задачи?


 
Ihor Osov'yak ©   (2002-12-05 12:26) [1]

Смотрим исходники VCL:


procedure TTimer.WndProc(var Msg: TMessage);
begin
with Msg do
if Msg = WM_TIMER then
try
Timer;
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;


procedure TTimer.Timer;
begin
if Assigned(FOnTimer) then FOnTimer(Self);
end;


Отсюда вывод - если основной поток будет не в состоянии обработать сообщение, то "вызов других обработчиков не происходит". Это может быть потому, что обработчики работают очень долго и там Application.ProcessMessages не дергаются...

Если это так - то все же Application.ProcessMessages можно юзать только тогда, когда нет опасности нарваться на неявную реентабельнось (или она ничемне чревата). Обьясняю на примере:

var s:string;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
old:string;
begin
old := s;
s:=s+" !!!!!!!!! blabla ";
for i:=1 to 1000000 do begin
Caption := s;
Application.ProcessMessages;
end;
s:=old;
Caption := s;
end;

end.

Счелкните два раза на бутончик (с секундным интервалом)) ... Видите, что еще обработка перврго щелчка не окончилась, а уже запускается обработка второго...


Если это чревато - запускайте обработку в отдельных потоках
(но не таймера :-))

Зы - а точность таймера,это совсем другой разговор ... Еще более долгий. Давайте вотрос на сию тему отдельной веткой ...








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

Текущий архив: 2002.12.16;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.014 c
14-51882
Леший
2002-11-22 16:00
2002.12.16
Подскажите, ссылку, где есть лицензия на INTERBASE сервер


1-51756
FLIZ
2002-12-04 15:49
2002.12.16
TTreeView c CheckBox-ами. как получить отмеченные узлы?


14-51891
Malder
2002-10-21 22:47
2002.12.16
Начинающим программистам. Этап 1


1-51801
Zipper
2002-12-05 11:01
2002.12.16
Как определить координаты каретки


14-51964
SV
2002-11-26 01:19
2002.12.16
Метро