Демонстрационное многопоточное приложение с динамическим изменением свойств окна и компонент

Содержание


Введение

. Реализация потоков в Delphi

.1 Потоки в Delphi

.2 Класс TThread

. Разработка демонстрационного многопоточного приложения

.1 Постановка задачи

.2 Выбор средств реализации

.3 Описание логики работы приложения и разработка программного обеспечения

.4 Описание пользовательского интерфейса

Заключение

Список использованной литературы

Приложение А (обязательное)

Введение


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

Одним из важнейших разделов информатики является программирование. Язык программирования - это формальный, искусственно созданный язык для написания и реализации алгоритма на компьютере.

Среди главных причин, принесших заслуженную популярность объектно-ориентированного программирования, следует отметить следующие:

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

·переход от существующих языков программирования к новым, прогрессивным информационным технологиям и сходство идей объектно-ориентированного программирования с идеями из других областей науки.

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

Преимущество ООП в наглядном представлении программы с помощью объектов (кнопок, строк для ввода информации и др.). Каждый объект принадлежит определенному классу. Например, кнопка (Button1) принадлежит классу кнопок TButton. В класс входит сколь угодно много объектов, объединенных в одну группу согласно их свойствам и поведению в среде окружения, в которой они существуют и взаимодействуют.

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

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

·Потоки в Delphi.

·Класс TThread.

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

1. Реализация потоков в Delphi


.1 Потоки в Delphi


Работая с Delphi, нужно иметь в виду: этот замечательный продукт не только упрощает разработку сложных приложений, он использует при этом все возможности операционной системы. Одна из возможностей, которую поддерживает Delphi, - это так называемые потоки (threads) или нити.

Потоки позволяют в рамках одной программы решать несколько задач одновременно. С недавних пор операционные системы для персональных компьютеров сделали это возможным.

Операционная система (ОС) предоставляет приложению некоторый интервал времени центрального процессора (ЦП) и в момент, когда приложение переходит к ожиданию сообщений или освобождает процессор, операционная система передает управление другой задаче. Теперь, когда компьютеры с более чем одним процессором резко упали в цене, а операционная система Windows NT может использовать наличие нескольких процессоров, пользователи действительно могут запускать одновременно более одной задачи. Планируя время центрального процессора, Windows 95 или Windows NT распределяют его между потоками, а не между приложениями. Чтобы использовать все преимущества, обеспечиваемые несколькими процессорами в современных операционных системах, программист должен знать, как создавать потоки.

Потоки - это объекты, получающие время процессора. Время процессора выделяется квантами. Квант времени - это интервал, имеющийся в распоряжении потока до тех пор. пока время не будет передано в распоряжение другого потока.


1.2 Класс Tthread

представляет программисту полный доступ к возможностям программирования интерфейса Win32.

Класс TThread - прекрасный пример предоставления разработчику простого доступа к программированию потоков.

Зачем же нужен класс Thread и его потомки? Во-первых, этот объект позволяет создавать как бы несколько программ в одной (несколько процессов, или, потоков). Во-вторых, эти процессы могут выполняться как по очереди, так и одновременно (как запрограммирует разработчик). В-третьих, из этих процессов можно легко получить доступ ко всем глобальным данным программы, т.к. класс процесса является, по сути, просто частью программы - обычным юнитом (unit). В-четвертых, можно создать своих собственных потомков TThread и запустить сразу несколько экземпляров одного и того же созданного класса. В-пятых, каждым процессом очень легко управлять - запускать, завершать, приостанавливать, прерывать, устанавливать приоритетность, и т.д.

Сам API потоков не очень сложен, но предоставленные классом TThread возможности вообще замечательно просты. Все, что необходимо сделать, - это перекрыть виртуальный метод Execute.

Другая отличительная черта класса TThread - это гарантия безопасной работы с библиотекой визуальных компонентов VCL. Без использования класса TThread во время вызовов VCL могут возникнуть ситуации, требующие специальной синхронизации.

С точки зрения операционной системы поток - это ее объект. При создании он получает дескриптор и отслеживается ОС. Объект класса TThread - это конструкция Delphi, соответствующая потоку ОС. Этот объект VCL создается до реального возникновения потока в системе и уничтожается после его исчезновения.

2. Разработка демонстрационного многопоточного приложения


.1 Постановка задачи


Разработка демонстрационного многопоточного приложения с динамическим изменением свойств окна и компонент.

Основные требования: Наличие кнопок «Запуск потока», «Остановка потока», «Завершение потока» по нажатию на которые соответственно начинается, останавливается и завершается демонстрация работы потока. Запуск потока после его остановки должен выполняться с состояния, в котором поток был остановлен. После остановки потока обеспечить возможность сохранения данных в файле и загрузки их при следующем запуске программы.

Общие требования:

1.Для реализации многопоточного приложения использовать компонент TThread.

2.Тип приложения: GUI


.2 Выбор средств реализации


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

Так же в проекте используется TThread-абстрактный класс для реализации потоков.

Свойства и методы класса TThread, используемые в данном проекте представлены в таблицах 1 и 2.

Таблица 1.

Свойства класса TТhread.

СвойствоОписаниеproperty FreeOnTerminate: Boolean;Определяет, будет ли объект потока уничтожен автоматически при завершении потока. Если свойство равно True, то поток будет уничтожен автоматически при завершении, если свойство равно False, то поток должен уничтожаться явно в коде приложения.property Handle: THandle;Содержит дескриптор потока. Используется для управления потоком с помощью функций Windows API.property Priority: TThreadPriority;Определяет приоритет потока относительно других потоков в процессе.property ReturnValue: Integer;Определяет значение, возвращаемое потоком при его завершении.property Suspended: Boolean;Показывает, является ли поток приостановленным. Если установить свойство в True, то поток будет приостановлен, если установить свойство в False выполнение потока будет продолжено.property Terminated: Boolean;Показывает, был ли произведен вызов метода Terminate.property ThreadID: THandle;Идентифицирует поток в системе.

Таблица 2.

Методы класса TТhread.

МетодОписаниеconstructor Create(CreateSuspended: Boolean);Создает объект потока. Если параметр CreateSuspended равен False, то метод Execute будет вызван сразу. Если параметр CreateSuspended равен True, то метод Execute будет вызван только после вызова метода Resume.destructor Destroy; override;Уничтожает объект потока и освобождает память, выделенную для него.procedure DoTerminate; virtual;Вызывает событие OnTerminate.procedure Execute; virtual; abstract;Абстрактный метод, содержащий код, который будет выполняться при запуске потока.procedure Resume;Возобновляет выполнение приостановленного потока.procedure Suspend;Приостанавливает выполнение потока.procedure Synchronize(Method: TThreadMethod);Выполняет метод, вызванный в рамках главного VCL потока.procedure Terminate;Дает потоку сигнал на завершение, устанавливая свойство Terminated в значение True.function WaitFor: LongWord;Ожидает завершение потока и возвращает значение, определяемое свойством ReturnValue.2.3 Описание логики работы приложения и разработка программного обеспечения

демонстрационный многопоточный приложение delphi

В разрабатываемом приложении реализуется демонстрация работы многопоточного приложения на примере последовательного возрастания чисел от 1 до 20.

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

В отдельном потоке происходит изменение чисел, путем последовательного возрастания от 1 до 20.

В файл сохраняется значение переменных потока в момент его остановки и сохранения. И извлекаются из него при загрузке сохраненного потока.

В соответствии с необходимыми требованиями для реализации многопоточного приложения был использован компонент TThread.

Приложение состоит из 3-х модулей (unit). Два из которых содержат формы и один(модуль) - поток TMyThread.

Листинг программы приведен в приложении А.

При разработке программного обеспечения были использованы следующие команды и действия:

·Создали поток класса TThread : TMyThread = class(TThread).

·Описали класс TThread: procedure TMyThread.Execute.

·Создали на форме поле Мemo, в котором будет отображаться поток.

·Для реализации запуска, приостановления и возобновления потока, а также остановки, сохранения и загрузки сохраненного потока реализовано следующее меню, состоящее из 5 основных кнопок:

«Запуск» - запускает поток;

«Пауза» - «Продолжить» - приостанавливает и возобновляет поток;

«Остановка» - останавливает и сохраняет поток;

«Сохранить» - сохраняет поток;

«Загрузка» - загружает сохраненный поток.

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

·Добавили модуль SyncObjs, в котором находятся классы для реализации синхронизации.

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

·Для того, чтобы сохранить данные с поля Мemo мы использовали строку Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + Save.txt'); где ExtractFilePath(Application.ExeName) - это путь к нашему проекту.

·Для удобства также были созданы еще 2 формы, в одной форме идет запрос на сохранение, а в другой - подробная информация о программе.


.4 Описание пользовательского интерфейса


В интерфейсе проекта используются компоненты Delphi: Button, Memo, Label, SpinEdit.

Label - предназначен для отображения статического текста, то есть надписей и меток на Форме, которые не меняются в течение всего времени работы программы.- используется для ввода больших объёмов текста.- используется для реализации в программе команд с помощью обработчика события OnClick этого компонента.- представляет собой сочетание Edit и UpDown, оформленное как отдельный тип компонента.

При запуске проекта мы попадаем на следующую форму:


Рис.1. Запуск проекта.


Далее при нажатии на кнопку «Запуск» происходит запуск потока путем последовательного возрастания чисел от 1 до 20.


Рис.2. Запуск потока.

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


Рис.3. Приостановка потока.


Рис.4. Возобновление потока.


Запущенный поток можно остановить и сохранить, нажав на кнопку «Остановка», после чего появляется окно о сохранении потока. При нажатии на кнопку «Да» поток сохраняется. Можно отказаться от сохранения потока, нажав на кнопку «Нет». Впоследствии остановленный поток возможно сохранить при нажатии на кнопку «Сохранить».


Рис.5. Остановка и сохранение потока.


Сохраненный поток возможно загрузить с состояния, с которого он был остановлен, и продолжить, нажав на кнопки «Загрузить» и «Запуск».


Рис.6. Загрузка сохраненного потока.

Рис.7. Продолжение потока с сохраненного состояния.


Так же в проекте есть дополнительная форма для вывода информация о проекте.


Рис.8. О программе.

Заключение


В процессе выполнения курсового проекта усвоили некоторые возможности Delphi.

Целью курсовой работы было изучение языка программирования DELPHI и разработка практических заданий.

При выполнении курсовой работы была изучена теория и технология работы со средой программирования Borland Delphi7 и TThread-абстрактный класс для реализации потоков.

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

Список использованной литературы


1.Архангельский А.Я. Программирование в Delphi: Учебник по классическим версиям Delphi. - М.: Бином, 2006.

2.Дмитрий Осипов. Delphi.Профессиональное програмирование.-2006

3.Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов - Спб.: Лидер, 2010.

4.Справочник Основы Delphi URL - <#"justify">6.Свободная интернет-энциклопедия Wikipedia. URL - #"justify">Приложение А (обязательное)


Листинг программыUnit1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, SyncObjs, Spin;= class(TForm): TButton;: TMemo;: TButton;: TButton;: TButton;: TButton;: TSpinEdit;: TButton;: TButton;Button1Click(Sender: TObject);FormShow(Sender: TObject);Button2Click(Sender: TObject);Button3Click(Sender: TObject);Button4Click(Sender: TObject);Button6Click(Sender: TObject);SpinEdit1Change(Sender: TObject);Button7Click(Sender: TObject);Button5Click(Sender: TObject);

{ Private declarations }

{ Public declarations };= class(TThread)

{ Private declarations }

{ Public declarations }:integer;:TStringList;LoadFromFileMemo;Execute; override;Create(CreateSuspended: boolean);;:TMyThread;: TForm1;:Tcriticalsection;,g,delay:integer;Unit2, Unit3;

{$R *.dfm}TMyThread.Create(CreateSuspended: boolean);Create(CreateSuspended);:=Form1.SpinEdit1.Value;;TMyThread.Execute;.Enter;:=TStringList.Create;.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Loading.txt');iteri:=g to StringListLoads.Count -1 doself.Terminated then break;(delay);[iteri];:=iteri;(LoadFromFileMemo);;.Leave;:=0;;TForm1.FormShow(Sender: TObject);:=Tcriticalsection.create;;TMyThread.LoadFromFileMemo;.Memo1.Lines.Add(StringListLoads[StringListCount]);;TForm1.Button1Click(Sender: TObject);:=TMyThread.Create(true);.FreeOnTerminate:=true;.Resume;;TForm1.Button2Click(Sender: TObject);Button2.Caption='Пауза' then begin.Enabled:=false;.Enabled:=false;.Enabled:=false;.Enabled:=false;.Suspend;.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'Save.txt');.Caption:='Продолжить';;;Button2.Caption='Продолжить' then begin.Resume;.Caption:='Пауза';.Enabled:=true;.Enabled:=true;.Enabled:=true;.Enabled:=true;;;TForm1.Button3Click(Sender: TObject);.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'Save.txt');.Caption:='Пауза';.Terminate;;TForm1.Button4Click(Sender: TObject);.Clear;.Lines.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Save.txt');:=memo1.Lines.Count;;TForm1.Button6Click(Sender: TObject);.Terminate;.ShowModal;.Clear;;TForm1.SpinEdit1Change(Sender: TObject);:=SpinEdit1.Value;;TForm1.Button7Click(Sender: TObject);;;TForm1.Button5Click(Sender: TObject);.Terminate;.ShowModal;;.Unit2;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls;= class(TForm): TButton;: TButton;: TLabel;: TLabel;Button1Click(Sender: TObject);Button2Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm2;Unit1;

{$R *.dfm}TForm2.Button1Click(Sender: TObject);.Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'Save.txt');;;TForm2.Button2Click(Sender: TObject);;;.Unit3;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls;= class(TForm): TButton;: TLabel;: TLabel;: TLabel;Button1Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm3;

{$R *.dfm}TForm3.Button1Click(Sender: TObject);;;.


Теги: Демонстрационное многопоточное приложение с динамическим изменением свойств окна и компонент  Курсовая работа (теория)  Информационное обеспечение, программирование
Просмотров: 9046
Найти в Wikkipedia статьи с фразой: Демонстрационное многопоточное приложение с динамическим изменением свойств окна и компонент
Назад