когда-нибудь добавил 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 в то время как другие ярлыки обновляются на свои места интервалами.р><дел стиль= \ ясно:оба поплавка:нет'>дел><дел стиль= \ ясно:оба поплавка:нет'> & мочекаменная див>