Многопоточный таймеры

Многопоточный таймеры


когда-нибудь добавил TTimer для вашего приложения только чтобы найти, что его события не выполняется потому, что основной поток VCL-это занят?

<границы таблицы="0" cellspacing="3" cellpadding="3" тр><тд><шрифта="шрифт Arial" Размер="6" цвет="#число FF0000"> Дельфи разработчика <тд выровняйте="право"><шрифта="шрифт Arial" Размер="6" цвет="#число FF0000">сентябрь 2000 <класс p="step_content ">в авторском шедевре издание, Инк. Все права защищены.<шрифта="шрифт Arial" Размер="6" цвет="#число FF0000">будет реальная таймера выполните?

<б>Стив Zimmelman



по необходимости часто на выдумки хитра, и этот раз не стал исключением. Пока я работал на некоторые Microsoft Word и Excel-интеграции, возникла проблема, когда я был обработки документов с помощью свойства visible значение false. Слово будет отображаться в диалоговом окне (в том, что пользователь не видел) и ждать ответа. Ну, разумеется, это сделал приложения появляются, как будто он был повешен. Мне нужен способ, чтобы времени на процесс и обращаться с вещами, они должны занять слишком много времени. Так мне влепили компонент TTimer на форму, задать интервал 1000 (одной второй), и посчитали количество раз, когда событие таймера выполнится. Звучит неплохо, верно? Неправильно! Когда диалоговое окно слово показал себя, он использует основной поток VCL, в которой, в свою очередь, не уступая место другим процессам, в том числе и TTimer. Так, в очередной раз, приложение появилось, как будто он был повешен.



решение было создать тему, что бы отслеживать время, не важно, насколько занят основной поток VCL с был. Но создавать поток каждый раз, когда мне нужна эта функциональность, кажется, не как лучшее решение с объектно-ориентированной точки зрения. Так что я создал новый компонент Таймер, что бы создать и использовать свою собственную внутреннюю нить и выполнить метод события на определенном интервале<.бр />


компонент TThreadTimer является результатом. Это простой подкласс класса TComponent, который управляет внутренней резьбой. Поток создается и уничтожается компонентом. Когда свойство Enabled имеет значение True, создается поток, и если false, то он будет уничтожен. Я также хотел убедиться, что нить не создаются в режиме конструктора. Поэтому я проверил ComponentState перед выполнением любой методики:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TThreadTimer.SetEnabled(значение:Булево) и

и начинается

и & евро & евро & евро если (значение <> FEnabled) потом начинается

и & евро & евро & евро & евро & евро & евро FEnabled := Значение

& евро & евро & евро & евро & евро & покупка // не создать или убить поток, если

& евро & евро & евро & евро & евро & покупка // приложение запущено.

& евро & евро & евро & евро & евро & евро если не (csDesigning в ComponentState)

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро тогда начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро, если FEnabled потом начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FTimerEventCount := 0

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FThread := TTheThread.Создать(Самовыдвижение)

& евро & евро & евро & евро & евро & евро & евро & евро & евро скалярные

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро KillThread

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная конце

& фитоэстрогены & евро & евро & евро & евро & евро конец

& евро & евро & евро конец

конец



я использовал метод, называемый KillThread, чтобы остановить поток выполнения и освободить его. Прежде чем я на самом деле может разрушить нить, мне нужно быть уверенным, что событие не в середине обработки. Если поток был освобожден в то время как событие было выполнено, исключение будет поднят, потому что мероприятие вернется в поток, который уже не существовал. Я справился с простой Булевой переменной, FOnTimerEventInProgress, что получил инициализируется в значение True, прежде чем Таймер произошло событие, и переключил в false только после того, как он закончил:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TThreadTimer.KillThread

и начинается

и & евро & евро & евро
и в
& евро & евро & евро & евро & евро & евро FEnabled := ложь

& евро & евро & евро & евро & евро & евро если (FThread <> мь) Затем начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & покупка // ждать OnTimerInterval события

& евро & евро & евро & евро & евро & евро & евро & евро & покупка // закончить до завершения потока.

& евро & евро & евро & евро & евро & евро & евро & евро & евро при FThread.FOnTimerEventInProgress

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро не начинается

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная приложения.ProcessMessages

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная конце

& евро & евро & евро & евро & евро & евро & евро & евро & евро FThread.Расторгнуть

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная FThread.Бесплатные

и & евро & евро & евро & евро & евро & мочекаменная конце

& евро & евро & евро, наконец,

& евро & евро & евро & евро & евро & евро FThread := мь

& евро & евро & евро & евро & евро & евро FTimerEventCount := 0

& евро & евро & мочекаменная конце

конец



потому что компонент включает какой-нить объект, и нить объект должен ссылаться на некоторые из свойств компонентов и методов, я использовал конструктор Create-нить, чтобы захватить ссылку на ее владельца:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

конструктор TTheThread.Создать(AOwner:TThreadTimer)

и начинается

и & евро & евро & евро FOnTimerEventInProgress := ложь

& покупка & покупка & покупка // нам нужно получить доступ к некоторым собственника

& покупка & покупка & покупка // свойств из потока.

& евро & евро & евро FOwner := AOwner

& евро & евро & евро наследуется создать(ложное), что

В конце



как-нить сам объект достаточно простой. Это есть создать конструктор,выполнение и таймера ontimer способ. Метод execute выполняет только после создания конструктора, и остается активным до тех пор, пока выполнение метода завершается. Я использовал прекращено собственность удержать поток живых, пока это явно сказано для выхода. Прекращена имеет значение True, если метод terminate потока называется. В Выполнение петли, я использую простой сон (), чтобы приостановить поток и ждать указанного интервала таймера. Я использую Приложение.ProcessMessages, чтобы убедиться, что нить все текущие обработки информации перед выполнением событие таймера. Я включил недвижимость в основных компонент, называемый SynchronizeEvent. Это делает TThreadTimer вести себя как стандартный компонент TTimer, синхронизируя события с главной компоненты VCL потока:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TTheThread.Выполнить в

и начинается

и & евро & евро & евро, а не самоназвание.Прекращается ли начинается

и & евро & евро & евро & евро & евро & мочекаменная приложения.ProcessMessages

& евро & евро & евро & евро & евро & мочекаменная спать(FOwner.Интервал)

& евро & евро & евро & евро & евро & мочекаменная приложения.ProcessMessages

& евро & евро & евро & евро & евро & евро если FOwner.SynchronizeEvent затем

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная синхронизации(таймера ontimer)

& евро & евро & евро & евро & евро & евро еще
<див класс='embed_block_0'> <див ИД="блок-google_admanager-1" класса="блок блок-google_admanager области-другие области-количество-1 Количество-1 блок-Без названия "> <див класс="блок-топ"> <див класс="блок-внутренний"> <див класс="содержание"> <див класс="блок-дна"> <див класс='embed_block_1'><див>
& евро & евро & евро & евро & евро & евро & евро & евро & евро таймера ontimer

& евро & евро & евро конечных и

В конце



процедура TTheThread.Таймера ontimer и

и начинается

и & евро & евро & евро
и в
& евро & евро & евро & евро & евро & евро, если назначат(FOwner.FOnTimerInterval) потом начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро если FOwner.Включается тогда начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FOnTimerEventInProgress := истина

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро Инк(FOwner.FTimerEventCount)

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FOwner.FOnTimerInterval(FOwner)

& евро & евро & евро & евро & евро & евро & евро & евро & евро конец

& евро & евро & евро & евро & евро & мочекаменная конце

& евро & евро & евро, наконец,

& евро & евро & евро & евро & евро & евро FOnTimerEventInProgress := Ложь

& евро & евро & евро конечных и

В конце



есть три основных части к TThreadTimer компонент: потока, интервал, и TimerEvent. Как уже упоминалось ранее, поток создается и уничтожается с помощью свойства Enabled. Как только создал поток, Таймер активен и выполняет мероприятия OnTimerInterval через заданный интервал истек.



есть также функция, которая называется TimerEventCount-это именно то, что подразумевает его имя. Это увеличивает целое число каждый раз, когда событие OnTimerInterval обрабатывается. Это может использоваться, чтобы наблюдать за потенциальными тайм-ауты. Например, вы могли бы иметь интервал набор за 1000 (одну секунду), и ловушки мероприятие TimerEventCount >= 60. Таким образом, если событие выполняется 60 раз, то минута прошла, и вы, возможно, потребуется, чтобы справиться с чем-то в приложении. Но помните, что этот Таймер в отдельном потоке, поэтому, пытаясь манипулировать другими объектами VCL в главном потоке может привести к исключениям.



после создания объекта ThreadTimer, это не займет много времени, чтобы понять, что событие таймера будет не в состоянии обновить все объекты в VCL, пока основной поток был занят. Например, если вы хотите проверить указатель записи в таблице, а Таблица обрабатывается и отображения результатов на названия, вы бы не повезло. Названия будут ждать, пока основной поток позволил ему обновить. Итак, вернемся к пресловутой чертежной доске еще раз.



я обнаружил, что TCanvas, по большей части, не используйте основной поток для обновления. Так что я создал новый компонент Лейбл TCanvasLabel. TCanvasLabel является подклассом класса TGraphicControl, и используется только свойство Canvas для рисования.



я создал TCanvasLabel поэтому он может использоваться в качестве ярлыка и progressbar. Свойства заливки, FillPercent, и fillcolor используются, чтобы нарисовать часть метки холста разного цвета. Краска используется для отображения содержимого этикетке:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TCanvasLabel.Краска

Вар

& евро & евро & евро Вильный : TRect

& евро & евро & евро fLeft,ФЦП : Целое число

и начинается

В & покупка & покупка & покупка // свойства autosize должно быть false, когда ярлык

и & покупка & покупка & покупка // используется в потоке кроме основного

& покупка & покупка & покупка // в VCL потоке.

& евро & евро & евро если autosize потом

& евро & евро & евро & евро & евро & евро метод setsize



& евро & евро & евро прямоугольника := ClientRect

& покупка & покупка & покупка // краски этикетка с основной цвет фона.

& евро & евро & мочекаменная холст.Кисти.Стиль := bsSolid

& евро & евро & мочекаменная холст.Кисти.Цвет := Собственн.Цвет

& евро & евро & мочекаменная холст.FillRect(ClientRect)



& евро & евро & евро если (FillPercent > 0) и FFill затем начинается

и & евро & евро & евро & евро & евро & покупка // рассчитать процент заполнения.

& евро & евро & евро & евро & евро & евро Вильный.Справа := Отбр((Вильный.Право *

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро (FillPercent / 100)))

& евро & евро & евро & евро & евро & евро холсте.Кисти.Цвет := цвет заливки

& евро & евро & евро & евро & евро & мочекаменная холст.FillRect(прямоугольник)

& евро & евро & мочекаменная конце

& евро & евро & евро холсте.Кисти.Стиль := bsClear



& евро & евро & евро случае выравнивания

& евро & евро & евро & евро & евро & евро taLeftJustify:

& евро & евро & евро & евро & евро & евро начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро fLeft := 0

& евро & евро & евро & евро & евро & мочекаменная конце



& евро & евро & евро & евро & евро & евро taRightJustify:

& евро & евро & евро & евро & евро & мочекаменная начинается

в & евро & евро & евро & евро & евро & евро & евро & евро & евро fLeft := ClientRect.Справа -

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро холсте.Текстовое(подпись)

& евро & евро & евро & евро & евро & мочекаменная конце



& евро & евро & евро & евро & евро & евро taCenter:

& евро & евро & евро & евро & евро & евро начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро fLeft := Отбр((ClientRect.Справа -

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро холсте.Текстовое(подпись))/2)

& евро & евро & евро & евро & евро & евро конец

& евро & евро & мочекаменная конце



& евро & евро & евро корпус макета

& евро & евро & евро & евро & евро & евро tlTop: ФЦП := 0

& евро & евро & евро & евро & евро & евро tlCenter:

& евро & евро & евро & евро & евро & евро & евро & евро & евро ФЦП := Отбр((ClientRect.Снизу

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная холст.Свойств textheight(подпись))/2)

& евро & евро & евро & евро & евро & евро tlBottom:

& евро & евро & евро & евро & евро & евро & евро & евро & евро ФЦП := (Самовыдвижение.Высота -

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная холст.Свойств textheight(подпись))



& евро & евро & мочекаменная конце

& евро & евро & евро холсте.TextOut(fleft,ФЦП,подпись)

& покупка & покупка & покупка // силу холст, чтобы обновлять себя.

& евро & евро & мочекаменная холст.Обновления

В конце



есть несколько предупреждений нужно остерегаться при использовании событий, которые используют темы:


<р класса="step_content ">


  • <я>свойства autosize в TCanvasLabel должен иметь значение false при запуске приложения. Изменения размера этикетки используются в основном потоке VCL, в поэтому надпись не обновить.


  • <я>не забудьте включить любые стандартные компоненты VCL объекты в поток событий без тщательного тестирования, или специально создает их в код внутри потока.в
<Р класса="step_content ">



простое использование обоих этих компонентов можно найти в демо-версии в прилагаемом файле. Простое приложение демонстрирует, как

А разница между стандартный TTimer и таймер нашли в компоненте TThreadTimer.



В случае TTimer обновляет названия с текущим временем каждую секунду. Для создания напряженного процесса, приложение добавляет 10 000 записей в цикле.







Вы заметите, что во время процесса добавления, время останавливается для стандартного TTimer в то время как другие ярлыки обновляются на свои места интервалами.<дел стиль= \ ясно:оба поплавка:нет'><дел стиль= \ ясно:оба поплавка:нет'> & мочекаменная







Многопоточный таймеры


Многопоточный таймеры : Несколько тысяч советов, которые сделают вашу жизнь проще.


когда-нибудь добавил TTimer для вашего приложения только чтобы найти, что его события не выполняется потому, что основной поток VCL-это занят?

<границы таблицы="0" cellspacing="3" cellpadding="3" тр><тд><шрифта="шрифт Arial" Размер="6" цвет="#число FF0000"> Дельфи разработчика <тд выровняйте="право"><шрифта="шрифт Arial" Размер="6" цвет="#число FF0000">сентябрь 2000 <класс p="step_content ">в авторском шедевре издание, Инк. Все права защищены.<шрифта="шрифт Arial" Размер="6" цвет="#число FF0000">будет реальная таймера выполните?

<б>Стив Zimmelman



по необходимости часто на выдумки хитра, и этот раз не стал исключением. Пока я работал на некоторые Microsoft Word и Excel-интеграции, возникла проблема, когда я был обработки документов с помощью свойства visible значение false. Слово будет отображаться в диалоговом окне (в том, что пользователь не видел) и ждать ответа. Ну, разумеется, это сделал приложения появляются, как будто он был повешен. Мне нужен способ, чтобы времени на процесс и обращаться с вещами, они должны занять слишком много времени. Так мне влепили компонент TTimer на форму, задать интервал 1000 (одной второй), и посчитали количество раз, когда событие таймера выполнится. Звучит неплохо, верно? Неправильно! Когда диалоговое окно слово показал себя, он использует основной поток VCL, в которой, в свою очередь, не уступая место другим процессам, в том числе и TTimer. Так, в очередной раз, приложение появилось, как будто он был повешен.



решение было создать тему, что бы отслеживать время, не важно, насколько занят основной поток VCL с был. Но создавать поток каждый раз, когда мне нужна эта функциональность, кажется, не как лучшее решение с объектно-ориентированной точки зрения. Так что я создал новый компонент Таймер, что бы создать и использовать свою собственную внутреннюю нить и выполнить метод события на определенном интервале<.бр />


компонент TThreadTimer является результатом. Это простой подкласс класса TComponent, который управляет внутренней резьбой. Поток создается и уничтожается компонентом. Когда свойство Enabled имеет значение True, создается поток, и если false, то он будет уничтожен. Я также хотел убедиться, что нить не создаются в режиме конструктора. Поэтому я проверил ComponentState перед выполнением любой методики:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TThreadTimer.SetEnabled(значение:Булево) и

и начинается

и & евро & евро & евро если (значение <> FEnabled) потом начинается

и & евро & евро & евро & евро & евро & евро FEnabled := Значение

& евро & евро & евро & евро & евро & покупка // не создать или убить поток, если

& евро & евро & евро & евро & евро & покупка // приложение запущено.

& евро & евро & евро & евро & евро & евро если не (csDesigning в ComponentState)

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро тогда начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро, если FEnabled потом начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FTimerEventCount := 0

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FThread := TTheThread.Создать(Самовыдвижение)

& евро & евро & евро & евро & евро & евро & евро & евро & евро скалярные

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро KillThread

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная конце

& фитоэстрогены & евро & евро & евро & евро & евро конец

& евро & евро & евро конец

конец



я использовал метод, называемый KillThread, чтобы остановить поток выполнения и освободить его. Прежде чем я на самом деле может разрушить нить, мне нужно быть уверенным, что событие не в середине обработки. Если поток был освобожден в то время как событие было выполнено, исключение будет поднят, потому что мероприятие вернется в поток, который уже не существовал. Я справился с простой Булевой переменной, FOnTimerEventInProgress, что получил инициализируется в значение True, прежде чем Таймер произошло событие, и переключил в false только после того, как он закончил:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TThreadTimer.KillThread

и начинается

и & евро & евро & евро
и в
& евро & евро & евро & евро & евро & евро FEnabled := ложь

& евро & евро & евро & евро & евро & евро если (FThread <> мь) Затем начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & покупка // ждать OnTimerInterval события

& евро & евро & евро & евро & евро & евро & евро & евро & покупка // закончить до завершения потока.

& евро & евро & евро & евро & евро & евро & евро & евро & евро при FThread.FOnTimerEventInProgress

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро не начинается

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная приложения.ProcessMessages

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная конце

& евро & евро & евро & евро & евро & евро & евро & евро & евро FThread.Расторгнуть

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная FThread.Бесплатные

и & евро & евро & евро & евро & евро & мочекаменная конце

& евро & евро & евро, наконец,

& евро & евро & евро & евро & евро & евро FThread := мь

& евро & евро & евро & евро & евро & евро FTimerEventCount := 0

& евро & евро & мочекаменная конце

конец



потому что компонент включает какой-нить объект, и нить объект должен ссылаться на некоторые из свойств компонентов и методов, я использовал конструктор Create-нить, чтобы захватить ссылку на ее владельца:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

конструктор TTheThread.Создать(AOwner:TThreadTimer)

и начинается

и & евро & евро & евро FOnTimerEventInProgress := ложь

& покупка & покупка & покупка // нам нужно получить доступ к некоторым собственника

& покупка & покупка & покупка // свойств из потока.

& евро & евро & евро FOwner := AOwner

& евро & евро & евро наследуется создать(ложное), что

В конце



как-нить сам объект достаточно простой. Это есть создать конструктор,выполнение и таймера ontimer способ. Метод execute выполняет только после создания конструктора, и остается активным до тех пор, пока выполнение метода завершается. Я использовал прекращено собственность удержать поток живых, пока это явно сказано для выхода. Прекращена имеет значение True, если метод terminate потока называется. В Выполнение петли, я использую простой сон (), чтобы приостановить поток и ждать указанного интервала таймера. Я использую Приложение.ProcessMessages, чтобы убедиться, что нить все текущие обработки информации перед выполнением событие таймера. Я включил недвижимость в основных компонент, называемый SynchronizeEvent. Это делает TThreadTimer вести себя как стандартный компонент TTimer, синхронизируя события с главной компоненты VCL потока:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TTheThread.Выполнить в

и начинается

и & евро & евро & евро, а не самоназвание.Прекращается ли начинается

и & евро & евро & евро & евро & евро & мочекаменная приложения.ProcessMessages

& евро & евро & евро & евро & евро & мочекаменная спать(FOwner.Интервал)

& евро & евро & евро & евро & евро & мочекаменная приложения.ProcessMessages

& евро & евро & евро & евро & евро & евро если FOwner.SynchronizeEvent затем

& евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная синхронизации(таймера ontimer)

& евро & евро & евро & евро & евро & евро еще
<див класс='embed_block_0'> <див ИД="блок-google_admanager-1" класса="блок блок-google_admanager области-другие области-количество-1 Количество-1 блок-Без названия "> <див класс="блок-топ"> <див класс="блок-внутренний"> <див класс="содержание"> <див класс="блок-дна"> <див класс='embed_block_1'><див>
& евро & евро & евро & евро & евро & евро & евро & евро & евро таймера ontimer

& евро & евро & евро конечных и

В конце



процедура TTheThread.Таймера ontimer и

и начинается

и & евро & евро & евро
и в
& евро & евро & евро & евро & евро & евро, если назначат(FOwner.FOnTimerInterval) потом начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро если FOwner.Включается тогда начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FOnTimerEventInProgress := истина

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро Инк(FOwner.FTimerEventCount)

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро FOwner.FOnTimerInterval(FOwner)

& евро & евро & евро & евро & евро & евро & евро & евро & евро конец

& евро & евро & евро & евро & евро & мочекаменная конце

& евро & евро & евро, наконец,

& евро & евро & евро & евро & евро & евро FOnTimerEventInProgress := Ложь

& евро & евро & евро конечных и

В конце



есть три основных части к TThreadTimer компонент: потока, интервал, и TimerEvent. Как уже упоминалось ранее, поток создается и уничтожается с помощью свойства Enabled. Как только создал поток, Таймер активен и выполняет мероприятия OnTimerInterval через заданный интервал истек.



есть также функция, которая называется TimerEventCount-это именно то, что подразумевает его имя. Это увеличивает целое число каждый раз, когда событие OnTimerInterval обрабатывается. Это может использоваться, чтобы наблюдать за потенциальными тайм-ауты. Например, вы могли бы иметь интервал набор за 1000 (одну секунду), и ловушки мероприятие TimerEventCount >= 60. Таким образом, если событие выполняется 60 раз, то минута прошла, и вы, возможно, потребуется, чтобы справиться с чем-то в приложении. Но помните, что этот Таймер в отдельном потоке, поэтому, пытаясь манипулировать другими объектами VCL в главном потоке может привести к исключениям.



после создания объекта ThreadTimer, это не займет много времени, чтобы понять, что событие таймера будет не в состоянии обновить все объекты в VCL, пока основной поток был занят. Например, если вы хотите проверить указатель записи в таблице, а Таблица обрабатывается и отображения результатов на названия, вы бы не повезло. Названия будут ждать, пока основной поток позволил ему обновить. Итак, вернемся к пресловутой чертежной доске еще раз.



я обнаружил, что TCanvas, по большей части, не используйте основной поток для обновления. Так что я создал новый компонент Лейбл TCanvasLabel. TCanvasLabel является подклассом класса TGraphicControl, и используется только свойство Canvas для рисования.



я создал TCanvasLabel поэтому он может использоваться в качестве ярлыка и progressbar. Свойства заливки, FillPercent, и fillcolor используются, чтобы нарисовать часть метки холста разного цвета. Краска используется для отображения содержимого этикетке:

<б><цвет шрифта="#000000" лицо="курьер Новый, Гельветика" Размер="2">

процедура TCanvasLabel.Краска

Вар

& евро & евро & евро Вильный : TRect

& евро & евро & евро fLeft,ФЦП : Целое число

и начинается

В & покупка & покупка & покупка // свойства autosize должно быть false, когда ярлык

и & покупка & покупка & покупка // используется в потоке кроме основного

& покупка & покупка & покупка // в VCL потоке.

& евро & евро & евро если autosize потом

& евро & евро & евро & евро & евро & евро метод setsize



& евро & евро & евро прямоугольника := ClientRect

& покупка & покупка & покупка // краски этикетка с основной цвет фона.

& евро & евро & мочекаменная холст.Кисти.Стиль := bsSolid

& евро & евро & мочекаменная холст.Кисти.Цвет := Собственн.Цвет

& евро & евро & мочекаменная холст.FillRect(ClientRect)



& евро & евро & евро если (FillPercent > 0) и FFill затем начинается

и & евро & евро & евро & евро & евро & покупка // рассчитать процент заполнения.

& евро & евро & евро & евро & евро & евро Вильный.Справа := Отбр((Вильный.Право *

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро (FillPercent / 100)))

& евро & евро & евро & евро & евро & евро холсте.Кисти.Цвет := цвет заливки

& евро & евро & евро & евро & евро & мочекаменная холст.FillRect(прямоугольник)

& евро & евро & мочекаменная конце

& евро & евро & евро холсте.Кисти.Стиль := bsClear



& евро & евро & евро случае выравнивания

& евро & евро & евро & евро & евро & евро taLeftJustify:

& евро & евро & евро & евро & евро & евро начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро fLeft := 0

& евро & евро & евро & евро & евро & мочекаменная конце



& евро & евро & евро & евро & евро & евро taRightJustify:

& евро & евро & евро & евро & евро & мочекаменная начинается

в & евро & евро & евро & евро & евро & евро & евро & евро & евро fLeft := ClientRect.Справа -

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро холсте.Текстовое(подпись)

& евро & евро & евро & евро & евро & мочекаменная конце



& евро & евро & евро & евро & евро & евро taCenter:

& евро & евро & евро & евро & евро & евро начинается

и & евро & евро & евро & евро & евро & евро & евро & евро & евро fLeft := Отбр((ClientRect.Справа -

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро холсте.Текстовое(подпись))/2)

& евро & евро & евро & евро & евро & евро конец

& евро & евро & мочекаменная конце



& евро & евро & евро корпус макета

& евро & евро & евро & евро & евро & евро tlTop: ФЦП := 0

& евро & евро & евро & евро & евро & евро tlCenter:

& евро & евро & евро & евро & евро & евро & евро & евро & евро ФЦП := Отбр((ClientRect.Снизу

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная холст.Свойств textheight(подпись))/2)

& евро & евро & евро & евро & евро & евро tlBottom:

& евро & евро & евро & евро & евро & евро & евро & евро & евро ФЦП := (Самовыдвижение.Высота -

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная холст.Свойств textheight(подпись))



& евро & евро & мочекаменная конце

& евро & евро & евро холсте.TextOut(fleft,ФЦП,подпись)

& покупка & покупка & покупка // силу холст, чтобы обновлять себя.

& евро & евро & мочекаменная холст.Обновления

В конце



есть несколько предупреждений нужно остерегаться при использовании событий, которые используют темы:


<р класса="step_content ">


  • <я>свойства autosize в TCanvasLabel должен иметь значение false при запуске приложения. Изменения размера этикетки используются в основном потоке VCL, в поэтому надпись не обновить.


  • <я>не забудьте включить любые стандартные компоненты VCL объекты в поток событий без тщательного тестирования, или специально создает их в код внутри потока.в
<Р класса="step_content ">



простое использование обоих этих компонентов можно найти в демо-версии в прилагаемом файле. Простое приложение демонстрирует, как

А разница между стандартный TTimer и таймер нашли в компоненте TThreadTimer.



В случае TTimer обновляет названия с текущим временем каждую секунду. Для создания напряженного процесса, приложение добавляет 10 000 записей в цикле.







Вы заметите, что во время процесса добавления, время останавливается для стандартного TTimer в то время как другие ярлыки обновляются на свои места интервалами.<дел стиль= \ ясно:оба поплавка:нет'><дел стиль= \ ясно:оба поплавка:нет'> & мочекаменная

Многопоточный таймеры

Многопоточный таймеры : Несколько тысяч советов, которые сделают вашу жизнь проще.
рекомендовать друзьям
  • gplus
  • pinterest

Комментарий

Оставить комментарий

Оценивать