Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
ifStrToFloat (SpinEdit1.Text) <2 then ⇐ ПредыдущаяСтр 3 из 3
Begin SpinEdit1.Value: = 2; Tag: = 0; Button1.Caption: = 'Квадрат' End End end; Таким образом, главный код программы связан с извлечением корня или возведением в квадрат величины, записанной в редакторе SpinEdit1. Теперь создадим модуль потока, в методе Execute которого будем непрерывно формировать по 100 строк в редакторе mmOutput и показывать процент заполнения редактора с помощью индикатора Gauge1. Выберем пиктограмму модуля потока в окне репозитория Delphi и дадим наследнику класса Thread имя ThreadDemo. Окончательный текст модуля потока может выглядеть так: unit Unit2; Interface Uses Classes; Type ThreadDemo = class (TThread) private { Private declarations } Protected S: String; N: Integer; procedure UpdateMemo; procedure UpdateGauge; procedure Execute; override; end; Var TDemo: ThreadDemo; Implementation uses Unit1, SysUtils; Important: Methods and properties of objects in VCL can only reused.in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure ThreadDemo.UpdateCaption; begin Formi.Caption: = 'Updated in a thread'; end; } ThreadDemo } procedure ThreadDemo.Execute; Var j, k: Integer; Begin Repeat S: =''; Synchronize (UpdateMemo); for k: = 0 to 99 do Begin N: = k; S: = ' '; for j: = 1 to 20 do S: = S+FormatFloat('00', k); Synchronize (UpdateMemo); Synchronize (UpdateGauge) end; until False end;
Procedure ThreadDemo.UpdateMemo; Begin WithForm1.mmOutput.Lines do if S=' ' then Clear else Add(S) end; Procedure ThreadDemo.UpdateGauge; Begin Form1.Gauge1.Progress: = N end; End. Если вы запустите таким способом подготовленную программу, то ничего не произойдет – ведь поток еще не запущен. Чтобы сделать это, добавим в модуле Unit1 главной формы ссылку uses Unit2, раскроем в окне Инспектора объектов список компонентов, выберем компонент Form1 и на его странице Events дважды щелкните по свойству onActivate, чтобы создать такой обработчик этого события: procedure TForm1.FormActivate(Sender: TObject); Begin TDemo: = ThreadDemo.Create (False), end; Вот так просто запускается дополнительный поток – инициируем объект TDemo, передавая в его Конструктор ThreadDemo. Create единственный параметр False (этот параметр показывает, должен ли вновь созданный поток “спать” – True или он обязан немедленно начать работу – False). Программа в любой момент может приостановить работу потока, присвоив его свойству Suspended значение True, и продолжить его выполнение, присвоив этому свойству значение False. Обратим внимание – метод Execute потока вынесен в секцию protected и поэтому недоступен из основного модуля. Выполнение этого метода начинается автоматически, как только свойство Suspended примет значение False. Для обращения к свойствам и методам визуальных компонентов формы Form1 предназначен специальный метод потока Synchronize. Единственным параметром обращения к этому методу должно быть имя любой потоковой процедуры без параметров. Внутри такой процедуры разрешается обращаться к методам и свойствам визуальных компонентов. В нашем потоке две такие процедуры – UрdateMemo и UpdateGuage. В первой строка S добавляется к содержимому редактора mmOutput, во втором – глобальная переменная n присваивается свойству progress индикатора Gauge1. Поскольку эти процедуры не могут иметь параметров, для управления их работой приходится использовать глобальные переменные S и N. Delphi представляет программисту полный доступ к возможностям программирования интерфейса Win32. Для чего же тогда фирма Borland представила специальный класс для организации потоков? Вообще говоря, программист не обязан разбираться во всех тонкостях механизмов, предлагаемых операционной системой. Класс должен инкапсулировать и упрощать программный интерфейс; класс TThread — прекрасный пример предоставления разработчику простого доступа к программированию потоков. Сам API потоков, вообще говоря, не очень сложен, но предоставленные классом TThread возможности вообще замечательно просты. В двух словах, все, что вам необходимо сделать, — это перекрыть виртуальный метод Execute. Другая отличительная черта класса TThread — это гарантия безопасной работы с библиотекой визуальных компонентов VCL. Без использования класса TThread во время вызовов VCL могут возникнуть ситуации, требующие специальной синхронизации. Нужно отдавать себе отчет, что с точки зрения операционной системы поток — это ее объект. При создании он получает дескриптор и отслеживается ОС. Объект класса TThread — это конструкция Delphi, соответствующая потоку ОС. Этот объект VCL создается до реального возникновения потока в системе и уничтожается после его исчезновения.
|