История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Топ:
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Интересное:
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Дисциплины:
2017-06-02 | 266 |
5.00
из
|
Заказать работу |
|
|
Класс приоритета | Наименование | Основной приоритет |
IDLE_PRIORITY_CLASS | Пассивный (фоновый) | |
NORMAL_PRIORITY_CLASS | Нормальный | 7 (фоновый) или 9 (переднего плана) |
HIGH_PRIORITY_CLASS | Высокий | |
REALTIME_PRIORITY_CLASS | Реального времени |
Существуют свои приоритеты и для потоков, но не абсолютные, а относительные – зависящие от приоритета порождающего их процесса. Таким образом при установке приоритета для потока необходимо сообщить системе, более высокий или низкий приоритет по сравнению с базовым следует установить, и система справится с этим сама. Естественно, чтобы выбрать для потока приоритет TIME_CRITICAL, нужно иметь очень веские основания, иначе другие процессы в системе могут не получить достаточного процессорного времени.
КЛАСС TTHREAD
Для реализации потоков Delphi предоставляет класс TThread. Наиболее важными методами являются Execute и Synchronize. Первый метод осуществляет выполнение потока. Этот метод абстрактный. Поэтому необходимо создать класс, который является потомком TThread, и в этом классе переопределить метод Execute. Второй метод Synchronize, чтобы избежать одновременного использования компонентов приложения, сообщает основной подзадаче, что требуется обращение к ресурсам, которые, возможно, заняты. При этом передается адрес метода, который основная подзадача может вызвать, чтобы выполнить требуемую потоком работу. Процесс извещения является последовательным и основная подзадача должна полностью завершить выполняемую работу, прежде чем получить следующее извещение. Извещающее сообщение отсылается при помощи подпрограммы Windows SendMessage. Результатом является то, что подзадача будет заморожена вплоть до полной отработки задания внутри основной подзадачи.
|
В программе перед выполнением потока, являющегося классом, естественно, должен быть построен соответствующий объект. Для этого вызывается метод Create, имеющий один аргумент CreateSuspended типа Boolean. Если поток создан со значением аргумента CreateSuspended = false, то он немедленно (как только получит время процессора в соответствии с его собственным приоритетом и приоритетом процесса) начинает выполняться (запускается метод Execute), в противном случае Execute запускается вызовом метода Resume. Внутри метода Execute могут выполняться некоторые циклические действия, для завершения которых можно воспользоваться свойством Terminated. Устанавливая значение этого свойства равным true или внутри метода Execute или извне, поток получает команду о завершении его работы. С помощью метода Suspend можно приостановить работу потока и затем продолжить, вызывая метод Resume. Переустанавливая значение свойства Priority, можно управлять приоритетом потока.
ПРИМЕР 27
Рассмотрим простой пример по использованию одного дополнительного потока. Пусть некоторый поток с помощью собственного метода, например, Paint применяется для закраски некоторой области прямоугольной формы. Основной поток приложения создается для рисования окружностей внутри той же области с помощью обработчика OnMouseDown.
Для построения приложения необходимо создать проект с двумя модулями. Один модуль – основная программа с объявленной переменной типа поток в секции Public внутри создавемого класса формы, другой модуль – модуль потока. Поместим на форму две кнопки TButton. Создадим для них два обработчика OnClick. Для формы, как уже отмечено, создается обработчик OnMouseDown. Далее создадим модуль для реализации вспомогательного потока (основной поток автоматически создается для процесса (приложения)).
Необходимо открыть меню File - New и выбрать пункт Other. Откроется диалоговое окно, в котором нужно выбрать (дважды щелкнуть мышкой) значок Thread Object. Когда появится диалоговое окно для именования объекта поток, необходимо ввести имя класса TThread (Class Name = TPaintThread) и нажать на кнопку OK. Ниже приводится весь программный код данного примера, который демонстрирует использование метода Synchronize.
|
unit MyThread1; {Модуль для определения потока}
Interface
uses Classes;
Type
TPaintThread = class(TThread)
Private
x,y:integer;
Protected
procedure Execute; override;
procedure Paint;
end;
Implementation
uses Unit27_1, Graphics;
procedure TPaintThread.Execute;
begin
randomize;
Repeat
x:=random(250);
y:=random(Form1.ClientHeight);
Synchronize(Paint);
until Terminated;
end;
procedure TPaintThread.Paint;
begin
Form1.Canvas.Pixels[x,y]:=clPurple;
end;
End.
unit Unit27_1; {Основной модуль}
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, MyThread1;
Type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
BitBtn1: TBitBtn;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure FormMouseDown (Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
public
MyPaintThread:TPaintThread;
end;
var Form1: TForm1;
Implementation
{$R *.dfm}
procedure TForm1.Button1Click (Sender: TObject);
begin
Button1.Enabled:=false;
Button2.Enabled:=true;
MyPaintThread:=TPaintThread.Create(false);
end;
procedure TForm1.Button2Click (Sender: TObject);
begin
MyPaintThread.Free;
Button1.Enabled:= True;
Button2.Enabled:= False;
end;
procedure TForm1.FormMouseDown (Sender: TObject;
Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
Canvas.Pen.Color:= Color;
Canvas.Brush.Color:= Color;
Canvas.Ellipse (x - 30, y - 30, x + 30, y + 30);
end;
End.
Следует обратить внимание на строку MyPaintThread:TPaintThread; и использование модуля Graphics. Среда Delphi может не добавить этот модуль в список Uses. На рис. 63 приводится вариант решения данного примера.
Рис. 63. Вариант решения примера 27.
ИСПОЛЬЗОВАНИЕ БЛОКИРОВКИ В ПРИМЕРЕ 27
Можно написать другой вариант решения данного примера, воспользовавшись особенностью компонента TCanvas. Дело в том, что этот компонент содержит два метода Lock и UnLock, которые позволяют блокировать вывод на канву с последующей разблокировкой. Естественно, при использовании этих методов канвы отпадает необходимость синхронизации работы потоков с помощью метода Synchronize.
Код программы приводится далее. Из текста кода основного модуля приводится только один обработчик TForm1.FormMouseDown, в который внесены изменения. Отметим, что код потока немного упростился.
unit MyTread2;
Interface
uses Classes;
Type
TPaintThread = class(TThread)
protected
procedure Execute; override;
end;
Implementation
uses Unit27_2, Graphics;
procedure TPaintThread.Execute;
var x,y:integer;
begin
randomize;
Repeat
x:=random(250);
y:=random(Form1.ClientHeight);
with Form1.Canvas do begin
Lock;
try
Pixels[x,y]:=clPurple;
|
finally
UnLock;
end;
end;
until Terminated;
end;
End.
unit Unit27_2;
.........
procedure TForm1.FormMouseDown (Sender: TObject;
Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
Canvas.Lock;
try
Canvas.Pen.Color:= Color;
Canvas.Brush.Color:= Color;
Canvas.Ellipse (x - 30, y - 30, x + 30, y + 30);
finally
Canvas.Unlock;
end;
end;
End.
Нельзя не заметить, что второй вариант примера работает значительно быстрее. Но, к сожалению, не все компоненты содержат указанные выше методы Lock и Unlock, поэтому не для любых потоков можно применить подобные приемы блокировки.
МНОГОПОТОЧНОЕ ПРИЛОЖЕНИЕ В ПРИМЕРЕ 28
В данном примере создаются три потока, которые закрашивают разным цветом один и тот же прямоугольник, как и в примере 27. Однако способ закраски в примере 28 отличается тем, что используется сканирование прямоугольной области. В варианте, который приводится ниже используется встроенная в класс TThread система безопасности с помощью метода синхронизации. Следует отметить, что данный подход не спасает приложение и компьютер от зависания, поэтому этот вариант примера лучше запускать из среды Delphi, чтобы можно было воспользоваться клавишами Ctrl+F2. Правда, вероятность зависания зависит от установленных приоритетов для каждого потока.
В примере используются новые компоненты: TTrackBar - для изменения приоритета потоков и TProgressBar – для визуального контроля скорости работы того или иного потока. Компонент TTrackBar применяется, когда требуется изменять значения в заданном диапазоне. Текущее значение определяется свойством Position, диапазон значений задается свойствами Min и Max. В примере задано Min=0, Max=3. Второй компонент (TProgressBar на странице Win32 - индикатор хода работ) показывает графическую полосу хода выполнения какой-либо операции. Текущая позиция индикатора определяется свойством Position, свойства Min и Max задают диапазон индикатора. В примере задано Min=0, Max определяется свойством формы ClientHeight, т.е. в данном случае количеством дисплейных строк. Количество участков, на которое делится весь диапазон задано равным 10. Это число определяет величину шага сканирования диапазона, которое записывается в свойстве Step. Ниже приводится программный код примера. Отметим, что в обработчике TrackBar1Change используются свойства Tag компонентов TtrackBar, которые соответственно необходимо с по мощью инспектора объектов установить равными 1, 2, 3.
|
unit MyThread3;
Interface
uses Classes, Graphics, ComCtrls;
Type
TPaintThread = class(TThread)
private
x,y:integer;
FColor:TColor;
FProgressBar:TProgressBar;
public
constructor InitColor(nColor:TColor);
|
|
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!