Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






ifStrToFloat (SpinEdit1.Text) <2 then






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 создается до реального возникновения потока в системе и уничтожается после его исчезновения.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.