Главная страница
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.017 c
6-51870
boolean
2002-10-07 13:40
2002.12.16
Help


14-51932
?????
2002-11-24 21:37
2002.12.16
<a href=


7-51969
matrixxxx
2002-10-13 19:40
2002.12.16
Все таже обучалка, но теперь надо в delphi запихать Html из папки


1-51751
Torrin
2002-12-04 10:38
2002.12.16
Сервисы


6-51871
izhalex
2002-10-07 18:00
2002.12.16
определить возможность подключения clientsocket к serversocket