Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
33
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

2. Технология связывания и внедрения объектов (ole)

Технология OLE (Object Linking and Embedding) реализуется компонентом OLE Container на панели System. Для вставки объекта выполняется команда контекстного меню Insert Object, которая выводит окно вставки объекта (рис. 79). Далее следует выбрать тип объекта.

Рис. 79. Окно вставки нового и готового объекта из файла

Если объект создается из готового файла, то указывается имя этого файла, и флажок Link (связь) включает режим связывания (включается ссылка на файл) или внедрение объекта (включается содержимое файла). Двойной щелчок по объекту вызывает программу, создавшую этот объект, и становится возможным откорректировать вставленный объект.

3. Многопоточные приложения

В программе можно создать фрагменты (потоки), которые будут выполняться одновременно. Каждому потоку отводится системой Windows квант времени на выполнение, по истечении которого осуществляется переход к следующему потоку и т.д. Это создает иллюзию одновременной работы нескольких потоков для однопроцессорного компьютера. Для многопроцессорного компьютера действительно можно распараллелить выполнение программы, что сокращает общее время ее выполнения.

Рис. 80. Окно выполнения приложения

Покажем порядок создания потоков на следующем примере. Создадим новое приложение и разместим три области рисования (компонент PaintBox) размером 100x100 пикселей (для вывода разноцветных квадратов) и две кнопки для запуска потоков (Старт) и завершения выполнения приложения (Финиш) (рис. 80). Командой File/New/Thread Object добавим потоковый объект с именем Potok. Появится модуль Unit2 с пустым описанием потомка класса TThread.

Приведем текст приложения с комментариями (формируемые автоматически фразы в тексте выделим полужирным курсивом или многоточием).

unit Until; //головной модуль Unitl

interface

uses

unit2; //подключение модуля Unit2

type TForml = class(TForm)

Public

procedure VivodFigurl; //объявление метода заполнения первой области

procedure VivodFigur2; //объявление метода заполнения второй области procedure VivodFigur3; //объявление метода заполнения третьей области procedure VivodFigur(Vf:TCanvas);//o6ъявление метода заполнения области

var Forml: TForml;

PI, P2, P3 : potok; //объявление переменных для трех потоков implementation {$R *.DFM}

procedure TForml.ButtonlClick(Sender:Tobject; )// обработка. кнопки Старт

begin

{Создание первого потока методом Create. Параметр True указывает, что запуск осуществляется после вызова метода Resum, иначе (False) - сразу после создания потока.}

pl:=potok.Create(true); //создание первого потока

pi.Priority:=tpHighest;

{установка приоритета выполнения потока: tpldle (при простое Windows), tpLowest/tpLower или tpHighest/tpHigher (на два/один пункта ниже или выше нормального), tpNormal (нормальный), tpTimerCritical (наивысший)}

р1:=NPotoka:=l; //признак работы первого потока

p2:=potok.Create(true);

p2.NPotoka:=2;

P2.Priority:=tpNormal; //второй поток

p3:=potok.Create(true);

p3.NPotoka:=3;

P3.Priority:=tpLowest; //третий поток

pl.Resume; p2.Resume;p3.Resume; //запуск 1,2, 3 потоков

end;

procedure TForml.VivodFigur(Vf:TCanvas);// вызов квадрата в области Vf

Var f: Тгес1;//объявление переменной записи с описанием квадрата

Begin

VfJBrush.Style:=bsSolid; //кисть рисует сплошную линию

Vf.Brush.Color:=rgb(random(256),random(256),random(256)); //цвет кисти

f.left:=random(90);f.top:=random(90);//Koopдинаты верхнего левого и f.right:=f.left+10; £Ьойот:=Г.1ор+10//нижнего правого углов квадрата

Vf.rectangle(f); //вывод квадрата в указанную параметром область

end; //конец процедуры

//процедуры вывода квадратов в 1,2 и 3 области для рисования

procedure TForml.VivodFigurl;

begin

VivodFigur(Paintboxl.Canvas); end;

procedure TForml.VivodFigur2;

begin VivodFigur(Paintbox2.Canvas); end;

procedure TForml.VivodFigur3;

begin VivodFigur(Paintbox3.Canvas); end;

procedure TForml.Button2Click(Sender:TObject);//обработка. кнопки Финиш

begin Application.Terminate; (завершение работы приложения} end;

end. //конец модуля Unitl

unit Unit2; //модуль Unit2 с описанием потокового объекта Potok

type

Potok = class(TThread) //объявление подкласса потока класса TThread

protected

procedure Execute;

override; //объявление метода выполнения потока public NPotoka: byte; //объявление переменной с номером потока end;

implementation uses unit 1; //подключение модуля Unitl

procedure potokExecute; //переопределение метода Execute

begin

{Метод Synchronize синхронизует работу всех потоков. Он имеет параметр - имя метода (без параметров), выводящего квадрат в нужной области}

while not Terminated do //Termmated=True после

Application.Terminate case NPotoka of//анализ текущего номера потока 1: Synchronize(Forml.VivodFigurl); //выполнение первого потока 2: Synchronize(Forml.VivodFigur2); //выполнение второго потока 3: Synchronize(Forml.VivodFigur3); //выполнение третьего потока end; end; end. //конец модуля Unit2