Главная страница
    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.009 c
3-51591
alcat
2002-11-26 07:01
2002.12.16
Помогите создать таблицу


1-51747
antonio2002
2002-12-04 13:36
2002.12.16
RichEdit


1-51693
Маленький
2002-12-05 21:28
2002.12.16
Как закрыть чужое приложение из своей программы?


4-51998
cyborg
2002-10-29 20:43
2002.12.16
Как создать полноэкранное окно без заголовка?


1-51814
Separator
2002-12-05 11:48
2002.12.16
StringGrid





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