Смекни!
smekni.com

Учебно-методическое пособие для студентов физико-математических специальностей вузов Балашов (стр. 18 из 18)

Метод Synchronize(Method:TThreadMethod) создан для безопасного вызова методов VCL внутри потока. В качестве аргумента передается имя метода, который производит обращение к VCL; вызов Synchronize аналогичен вызовам данного метода из модуля. К примеру, в основной форме приложения необходимо предусмотреть процедуру:

procedure TForm1. ShowMessage;

Var i:Integer;

begin

i:=RichEdit1.Lines.Count;

ShowMessage ('Данный текст содержит ' +IntToStr(i)+' строк ');

end;

При написании данной процедуры необходимо помнить, что если описывается процедура класса TForm1, то ее заголовок должен быть помещен в описание класса.

Для того чтобы вызвать данную процедуру из модуля формы, достаточно описать вызов ShowMsgCount, однако для вызова из потока необходимо записать Synchronize (TForm1.ShowMessage).

Для того чтобы добавить поток в проект, можно воспользоваться
репозиторием. Для этого, как и раннее, выберем пункт New меню File, на закладке New выберем объект типа поток (Thread Object). После этого появится диалоговое окно, в которое необходимо ввести имя нового класса объекта. Введем для примера имя TMyThread. После этого в редакторе кода появится дополнительная закладка, при выборе которой будет выдаваться шаблон для нового потока:

unit Unit2;

interface

uses Classes;

type

TMyThread = class(TThread)

private

{ Private declarations }

protected

procedure Execute; override;

end;

implementation

{ TMyThread }

procedure TMyThread.Execute;

begin

{ Код потока помещается здесь}

end;

end.

В данном примере многие комментарии, которые присутствуют
в шаблоне, опущены, а некоторые написаны на русском языке, хотя это принципиальным образом не меняет общий вид модуля. Рассмотрим некоторые примеры использования потоков.

Пример 1

Создадим простое многопоточное приложение, в котором в потоке будут производиться некоторые арифметические действия, например накопление суммы, с достаточно малым шагом.

Для решения данной задачи, имея пустую форму и используя репозиторий, добавим к проекту новый класс потока с именем TMyThread. Выбрав соответствующую закладку, будем редактировать данный модуль. Цель работы потока заключаются в том, что с достаточно малым шагом накапливается вещественное число, которое будет доступно из модуля главной формы. Для этого в описании класса создадим раздел Public
и опишем вещественное поле a, которое будет использоваться для получения значения. Кроме этого, дадим модулю имя Thrd. После этого описание класса будет иметь вид:

unit Thrd;

interface

uses Classes;

type

TmyThread = class(TThread)

private

{ Private declarations }

protected

procedure Execute; override;

Public

a:Real;

end;

procedure TMyThread.Execute;

begin

a:=0;

While a<=100000000 do a:=a+0.000001

end;

end.

Сохраним модуль с описанным в нем потоком под именем Thrd.pas, для чего выберем команду Save As из пункта меню File.

Откроем главный файл модуля и добавим Thrd к списку используемых модулей, после чего он должен выглядеть так:

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Thrd;

В секцию public формы TForm1 поместим две переменные типа поток следующей строкой:

Thread1,Thread2:TmyThread;

Инициализацию и запуск данных потоков будем производить в момент создания формы, используя событие onCreate. В этой же процедуре зададим различные приоритеты для данных потоков, после этого процедура будет иметь вид:

procedure TForm1.FormCreate(Sender: TObject);

begin

Thread1:=TMyThread.Create(False);

Thread1.Priority:=tpLower;

Thread2:=TMyThread.Create(False);

Thread2.Priority:=tpNormal;

end;

Поместим на форму два компонента. Метку, в которой будет отражаться текущее значение, полученное нами из потоков, и кнопку, при нажатии на которую это произойдет, тогда процедура будет:

procedure TForm1.Button1Click(Sender: TObject);

begin

Label1.Caption:=FloatToStr(Thread1.a);

Label2.Caption:=FloatToStr(Thread2.a);

end;

После этого основную форму можно задать произвольным образом, например, поместив на форму компонент RichEdit, в котором будем набирать любой текст. При запуске программы на исполнение работа приложения будет состоять из выполнения трех потоков. Первый и в то же время главный поток приложения будет позволять редактировать текст,
а два других — производить вычисления. Если нажать на кнопку формы, то результаты вычислений в потоке будут отображаться в метках.

При решении данного примера использовались два модуля, один из которых являлся модулем формы, а второй содержал описание потока, при этом к главному модулю подключался модуль с потоком. Как правило, работа с потоками осуществляется именно так, однако в этом случае из модуля потока нельзя обратиться к компонентам формы. Поэтому когда поток должен работать с формой, необходимо объединить эти два модуля в один. После объединения многопоточное приложение будет иметь вид:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ComCtrls, ExtCtrls;

type {описание потока}

TmyThread = class(TThread)

private

protected

procedure Execute; override;

procedure UpdateCaption;

Public

a:Real;

end;

type {описание формы}

TForm1 = class(TForm)

RichEdit1: TRichEdit;

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

public

Thread1 , Thread2:TMyThread; {два потока, описанные внутри формы }

end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TmyThread.Execute;

Var i,j:integer;

begin

a:=1;

While a<=100000000 do a:=a+0.000001;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Thread1:=TMyThread.Create(False);

Thread1.Priority:=tpLower;

Thread2:=TMyThread.Create(False);

Thread2.Priority:=tpNormal;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Label1.Caption:=FloatToStr(t.a);

Label2.Caption:=FloatToStr(t1.a);

end;

end.

Модифицируем данную программу так, чтобы значения, полученные
в потоке, влияли бы на форму. В этом случае при описании метода Execute нельзя обращаться к элементах формы, а необходимо создавать метод, который затем будет вызываться посредством метода Synchronize.

Задания:

1. Проверьте все программы из данной лабораторной работы.

2. Выполните задание, которое соответствует номеру вашего варианта.

3. Сделайте так, чтобы параллельно с вводом текста с клавиатуры
в программе подсчитывалось количество простых чисел из интервала.

Заключение

Прочитав данную книгу, читатель может (хотя, конечно, он должен) усвоить основные знания по созданию программ на языке высокого уровня Delphi. Это касается основных, первичных знаний языка высокого уровня. Достаточно одного взгляда на палитру имеющихся компонентов и на список литературы, чтобы представить себе все области современной информатики, в которой можно создавать приложения в среде программирования Delphi. В первую очередь это приложения, позволяющие обрабатывать базу данных посредством различных технологий — BDE, COM, ADO. На закладках Data Access и Data Control собраны подобные компоненты. Закладки dbExpress, BDE, dbGo также содержат компоненты работы с базами данных, однако применяются другие технологии доступа к ним. И как следует из самих названий закладок, существует огромное количество компонентов, которые позволяют работать с сетью и создавать как простые, так и интернетовские серверы. Кроме этого, в языке Delphi имеются все средства для создания чатов как локальных, так
и глобальных.

Нельзя не отметить возможности интеграции приложений, созданных в Delphi, приложений MS Office, возможности обмена информацией
с программой 1С: Предприятие.

В данном пособии изложены минимальные сведения о самых простых как визуальных, так и не визуальных компонентах, способы их обработки. Дальнейшее изучение является личным делом каждого человека, но хочется надеяться, что прочтение данной работы разбудило ваш интерес.

Список рекомендуемой литературы

Основная

1. Бобровский, С. И. Delphi 7: учебный курс / С. И. Бобровский. — СПб. : Питер, 2004. — 736 с.

2. Желонкин, А. В. Основы программирования в интегрированной среде DELPHI : практикум / А. В. Желонкин. — 2-е изд. М. : БИНОМ. Лаборатория знаний, 2006. — 236 с.

3. Истомин, Е. П. Высокоуровневые методы информатики и программирования / Е. П. Истомин, В. В. Новиков, М. В. Новикова. — М. : ООО «Андреевский издательский дом», 2006.

4. Пономарев, В. А. Базы данных в Delphi 7. Самоучитель / В. А. Пономарев. — СПб. : Питер, 2003. — 224 с.

Дополнительная

1. Галисеев, Г. В. Компоненты в Delphi 7. Профессиональная работа / Г. В. Галисеев. — М. : Диалектика. 2004. — 624 с.

2. Григорьев, А. Б. О чем не пишут в книгах по Delphi / А. Б. Григорьев. — СПб. : БХВ-Петербург, 2008. — 576 с.

3. Дарахвелидзе, П. Г. Программирование в Delphi 7 / П. Г. Дарахвелидзе. — СПб. : БХВ-Петербург, 2003. — 785 с.

4. Елманова, Н. Э. Delphi 6 и технология COM / Н. Э. Елманова, С. В. Трепалин, А. Тенцер. — СПб. : Питер, 2002. — 640 с.

5. Кондукова, Е. Delphi и 1C: Предприятие. Программирование информационного обмена / Е. Кондукова. — СПб. : БХВ-Петербург, 2007. — 592 с.

6. Корняков, В. Н. Программирование документов и приложений MS Office
в Delphi / В. Н. Корняков. — СПб. : БХВ-Петербург, 2005. — 496 с.

7. Культин, Н. Б. Основы программирования в Delphi 2007 / Н. Б. Культин. — СПб. : БХВ-Петербург, 2008. — 480 с.

8. Попов, С. А. Delphi и 1С: Предприятие. Программирование информационного обмена / С. А. Попов. — СПб. : БХВ-Петербург, 2007. — 592 с.

9. Хомоненко, А. Д. Delphi 7 / А. Д. Хомоненко, В. Гофман, М. Мещеряков
[и др.]. — СПб. : БХВ-Петербург, 2004. — 1216 с.

10. Шкрыль, А. А. Разработка клиент-серверных приложений в Delphi /
А. А. Шкрыль. — СПб. : Питер, 2006. — 480 с.


Учебно-методическое издание

Кузнецов Олег Анатольевич

Основы программирования в среде Delphi

Учебно-методическое пособие

для студентов физико-математических специальностей вузов

Редактор М. Б. Иванова

Корректор Н. Н. Дробышева


Подписано в печать 14.04.09. Формат 60×84/16.

Уч.-изд. л. 5,6. Усл.-печ. л. 6,5.

Тираж 100 экз. Заказ №

Издательство «Николаев»,

г. Балашов, Саратовская обл., а/я 55.

Отпечатано с оригинал-макета,

изготовленного издательской группой
Балашовского института Саратовского университета.

412309, г. Балашов, Саратовская обл., ул. К. Маркса, 29.

Печатное агентство «Арья»,

ИП «Николаев», Лиц. ПЛД № 68-52.

412309, г. Балашов, Саратовская обл.,

ул. К. Маркса, 43.

E-mail: arya@balashov.san.ru