КАТЕГОРИИ: Архитектура-(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
Существуют свои приоритеты и для потоков, но не абсолютные, а относительные - зависящие от приоритета порождающего их процесса. Таким образом, при установке приоритета для потока необходимо сообщить системе, более высокий или низкий приоритет по сравнению с базовым следует установить, и система справится с этим сама. Естественно, чтобы выбрать для потока приоритет 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.
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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |