Мегаобучалка Главная | О нас | Обратная связь


Лабораторная работа 12. Потоки



2020-02-04 213 Обсуждений (0)
Лабораторная работа 12. Потоки 0.00 из 5.00 0 оценок




Цель: изучить классы TStream и TThread, возможности при создании многопоточных приложений.

В языке программирования Delphi имеется два различных вида потоков: поток данных и поток команд.

В начале несколько слов о потоках данных — класс TStream. Потоки данных — это обобщенная модель двоичных данных, размещенных на устройствах-накопителях, таких как диски, оперативная память и т. д. Любой поток обладает двумя ключевыми свойствами — размером в байтах (свойство Size) и текущей позицией (Position). Родоначальником всех потоков является абстрактный класс TStream, от которого порождены некоторые специализированные потоки, такие как: TFileStream (файловый поток), TMemoryStream (поток буферов в памяти) и т. д. Более подробно данные потоки можно изучить самостоятельно, а сейчас рассмотрим потоки событий.

Одна из возможностей, которая имеется в операционной системе Windows и поддерживается языком программирования Delphi — это потоки действий или нити (thread). Смысл потоков заключается в том, что одновременно может выполняться несколько различных видов работы. Например, приложения Word и Excel задействуют сразу несколько потоков. Word может одновременно корректировать грамматику, печатать документ
и осуществлять ввод данных с клавиатуры.

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

В языке программирования Delphi потоки реализованы в виде объектов, которые получают время работы процессора квантами (около 19 мс).

Класс TThread позволяет программировать потоки. В отличие от визуальных компонентов из библиотеки VCL, которые автоматически формируются при создании формы, потоки необходимо самостоятельно инициализировать посредством конструктора Creat ( CreatS : Boolean ). Если значение логического параметра CreatS имеет значение False, то поток сразу после создания начинает исполняться, если значение данного параметра будет True, то для запуска метода на исполнение необходимо использовать метод Resume . Деструктор Destroy вызывается, когда необходимость в потоке отпадает, при этом поток останавливается и освобождаются все ресурсы, связанные с этим потоком. Метод Terminate осуществляет завершение потока (без последующего запуска), а метод Suspend позволяет приостановить выполнение потока. Логическое свойство Suspended проверяет, приостановлен ли поток или продолжает выполняться. С помощью этого свойства можно приостановить и запустить поток на исполнение. Установив его в True, получаем тот же эффект, что и при вызове метода Suspend, а установив в False, возобновляем выполнение потока, как и метод Resume.

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

Рассмотрим еще несколько важных свойств и методов потоков.

Свойство Priority класса TThreadPriority позволяет запрашивать и определять приоритет потоков. Приоритет определяет, насколько часто поток будет получать время работы процессора. Допустимые значения приоритетов — tpIdle , tpLowest , tpLower , tpHigher , tpHigest , tpTImeCritical. В данном списке перечислены приоритеты от самого низкого — фонового приоритета, до самого высокого — приоритета реального времени. Необходимо быть очень внимательным при использовании двух последних приоритетов, поскольку они могут влиять на выполнение всего приложения. Как правило, используются приоритеты tpLowest и tpLower.

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

procedure TForm1. ShowMessage;

Var i:Integer;

begin

 i:=RichEdit1.Lines.Count;

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

end;

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

Для того чтобы вызвать данную процедуру из модуля формы, достаточно описать вызов 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 формы TForm 1 поместим две переменные типа поток следующей строкой:

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 с.


 

 

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

 

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

 

 



2020-02-04 213 Обсуждений (0)
Лабораторная работа 12. Потоки 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа 12. Потоки

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (213)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)