|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Приоритет потока и приоритет процесса
Добрый день! Не нашёл здесь на форуме похожей темы, решил создать новую. Имеется несколько таймеров, каждый из которых выполняет большое количество действий и с малым интервалом, иногда такое приложение подвисает. Можно для каждого таймера создать поток с высоким приоритетом. Например, для двух таймеров:
Код1: Код:
TPotok1=class (TThRead) protected procedure Execute();override; end; TPotok2=class (TThRead) protected procedure Execute();override; end; var Potok1: TPotok1; Potok2: TPotok2; procedure TPotok1.Execute(); begin While not Terminated do Form1.Timer1.Enabled:=true; end; procedure TPotok2.Execute(); begin While not Terminated do Form1.Timer2.Enabled:=true; end; procedure TForm1.FormCreate(Sender: TObject); begin Potok1:=TPotok1.Create(false); Potok1.Priority:=tpHighest; Potok2:=TPotok2.Create(false); Potok2.Priority:=tpHighest; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Potok1.Terminate; Potok2.Terminate; end; procedure TForm1.Timer1Timer(Sender: TObject); begin //действие таймера 1 Timer1.Enabled:=false; end; procedure TForm1.Timer2Timer(Sender: TObject); begin //действие таймера 2 Timer2.Enabled:=false; end; Как вариант, можно для приложения задать высокий приоритет процесса: Код2: Код:
SetPriorityClass(GetCurrentProcess,HIGH_PRIORITY_CLASS); Прочёл в литературе, что потоки получают приоритеты на базе классов приоритета своих процессов. Означает ли это, что если задать высокий приоритет процесса, то все таймеры будут работать с высоким приоритетом и в таком случае не надо заморачиваться с приоритетами потоков? Другими словами, Код2 оставить, а Код1 можно убрать? |
#2
|
||||
|
||||
Я бы посоветовал убрать вообще таймеры из основного потока (читай - нафиг они не нужны на форме). А вместо этого в самом потоке использовал бы тупо SLEEP(XXXX). Примерно так:
Код:
procedure TPotok1.Execute(); begin While not Terminated do begin sleep(XXX); //действие таймера N end; end; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |