Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Приоритеты потоков




ПРОГРАММНЫЕ ПОТОКИ

Программные потоки {подзадачи, нити, Threads) - мощный инстру­мент, когда приложению необходимо выполнять сразу несколько действий (по крайней мере, они создают иллюзию одновременного выполнения не­скольких операций). Если задачу приложения можно разделить на различ­ные блоки: ввод или вывод, связь, обработка некоторых особых событий и т.д., то потоки могут быть органично встроены в программные решения. Сделав приложение многопоточным, можно получить дополнительные воз-


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

Потоки в полной мере эксплуатируют операционную систему. Напри­мер, летяшие листы бумаги, которые мы видим, когда копируется файл, ото­бражаются на экране, благодаря активной подзадаче, в то время как основ­ной процесс занят копированием данных. На самом деле операционная сис­тема (если не используется многопроцессорные компьютеры) "героически разрывается" между различными процессами и подзадачами, периодически приостанавливая одну выполняемую задачу и переходя к следующей в вечно крутящейся карусели. Таким образом, поток - это объект, созданный внут­ри процесса и получающий время процессора, которое выделяется квантами.

Когда Windows загружает программу, строится процесс, для которого создается хотя бы один поток, чтобы запустить программный код. Процессы определяют данные, ресурсы, адресное пространство и пространство вирту­альных адресов. Потоки, работающие в данном процессе, используют все ресурсы, предоставленные процессу операционной системой, и отвечают за выполнение кода. Потоки подразделяются на симметричные (они имеют одинаковое предназначение, исполняют один и тот же код и могут разделять одни и те же ресурсы) и асимметричные (решающие различные задачи и, как правило, не разделяющие совместные ресурсы).

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

Операционная система может назначать приоритеты в соответствии со своими установками, или можно задать нужный приоритет, используя спе­циальные системные подпрограммы (например, SetPriorityClass). Система при выполнении приложения будет расставлять подзадачи в соответствии с их приоритетом и в том случае, когда нет доступных для выполнения под­задач с высоким приоритетом, выполняются подзадачи с приоритетом более низкого уровня. Если несколько подзадач имеют один и тот же уровень при­оритета, то они расставляются системой и выполняются одна за другой по кругу.

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


как базовый (base priority). Базовый приоритет может изменяться от 0 до 31. Для потоков можно использовать приоритеты от 0 до 15, если процесс не имеет приоритета realtime_priority_class. В табл. 16 приводятся ос­новные сведения по приоритетам процессов.

Таблица 16

Класс приоритета Наименование Основной приоритет
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) и нажать на кнопку ОК. Ниже приводится весь программный код данного примера, который демон­стрирует использование метода Synchronize.

unit MyThreadl; {Модуль для определения потока}

interface

uses Classes;

type

TPaintThread = class(TThread)

private

x,у: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(Faint);

until Terminated; end;

procedure TPaintThread.Paint; begin

Form1.Canvas.Pixels[x,y]:=clPurple; end; end.

SysUtils, Variants, Classes, Forms, Dialogs, StdCtrls, ExtCtrls,

unit Unit27_1; {Основной модуль} interface

uses Windows, Messages, Graphics, Controls, Buttons, MyThreadl;

type

TForm1 = class(TForm) Button1: TButton; Button2: TButton; BitBtnl: 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, у - 30, x + 30, у + 30);

end; end.

Следует обратить внимание на строку MyPaintThread:TPaintThread; и использование модуля Graphics. Среда Delphi может не добавить этот модуль в список Dses. На рис. 63 приводится вариант решения данного примера.

Рис. 63




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 1722; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.