Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв ВУМИП 2012-07-06.doc
Скачиваний:
66
Добавлен:
13.05.2015
Размер:
9.35 Mб
Скачать

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

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

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

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

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

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

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

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

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

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

interface

uses

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

type

TForm1 = class(TForm)

...

Public

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

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

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

procedureVivodFigur(Vf:TCanvas);//объявление метода заполнения области

...

var

Form1: TForm1;

P1,P2,P3 :potok; //объявление переменных для трех потоков

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender:TObject);//обработ. кнопки Старт

begin

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

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

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

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

p2:=potok.Create(true); p2.NPotoka:=2; P2.Priority:=tpNormal; //второй поток p3:=potok.Create(true); p3.NPotoka:=3; P3.Priority:=tpLowest; //третий поток

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

end;

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

Varf:Trect;//объявление переменной записи с описанием квадрата

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

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

f.left:=random(90);f.top:=random(90);//координаты верхнего левого и

f.right:=f.left+10; f.bottom:=f.top+10;//нижнего правого углов квадрата

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

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

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

procedure TForm1.VivodFigur1; begin VivodFigur(Paintbox1.Canvas); end; procedure TForm1.VivodFigur2; begin VivodFigur(Paintbox2.Canvas); end;

procedure TForm1.VivodFigur3; begin VivodFigur(Paintbox3.Canvas); end; procedure TForm1.Button2Click(Sender:TObject);//обработ. кнопки Финиш

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

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

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

...

type

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

...

protected

procedure Execute; override; //объявление метода выполнения потока

publicNPotoka:byte; //объявление переменной с номером потока

end;

implementation

uses unit1; //подключение модуля Unit1

...

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

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

while not Terminated do //Terminated=True после Application.Terminate

caseNPotokaof//анализ текущего номера потока

1: Synchronize(Form1.VivodFigur1); //выполнение первого потока

2: Synchronize(Form1.VivodFigur2); //выполнение второго потока

3: Synchronize(Form1.VivodFigur3); //выполнение третьего потока

end;

end;

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