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

Вниз

Параллельные действия и 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.006 c
3-51632
Fishka
2002-11-28 14:38
2002.12.16
Длина имени таблицы в INTERBASE -?


4-52035
cardinal
2002-10-31 02:36
2002.12.16
Как узнать адреса процессов в w98?


3-51572
Dbrf
2002-11-27 10:41
2002.12.16
Нумерация записей


6-51859
slaventii
2002-10-18 12:04
2002.12.16
Local Network WorkGroups


14-51955
ded_di
2002-11-25 11:25
2002.12.16
Посоветуйте.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский