Главная страница
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.015 c
1-51815
Uran
2002-12-05 09:24
2002.12.16
Как пристыковать форму к панели?


14-51946
Кен
2002-11-21 03:10
2002.12.16
Как конвертировать DLL в Дельфи? Чтобы можно было чуть чуть подпр


1-51817
Masa
2002-12-04 15:10
2002.12.16
RX и Delphi 7


1-51711
Маришка
2002-12-06 08:32
2002.12.16
день


1-51674
AlexT1000
2002-12-05 16:15
2002.12.16
Как отловить нажатия Alt ,Ctrl,Shift для всего приложения в целом