Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование лекции.doc
Скачиваний:
49
Добавлен:
12.11.2019
Размер:
5.53 Mб
Скачать

22.2. Управление скоростью работы потоков

Рассмотрим на примере влияние приоритета на скорость работы потока. Создадим приложение, в котором два потока будут взаимодействовать с одним и тем же объектом типа Timage. Первый поток будет перекрашивать точку со случайными координатами в белый цвет, а второй – в черный.

Добавим в проект два потока с именами time1 и time2. На форму поместим объект типа Timage и кнопку. Описание обоих потоков аналогично и выглядит следующим образом:

unit thr1;

interface

uses

Classes, ExtCtrls, Graphics, forms, windows;

type

time1 = class(TThread)

private

{ Private declarations }

procedure UpdateTimer;

protected

procedure Execute; override;

end;

implementation

uses main;

procedure time1.updatetimer;

var x,y:integer;

begin

with form1.Image1 do

begin

x:=random(width);

y:=random(height);

Canvas.Pixels[x,y]:=clWhite;

{ для второго потока clBlack }

end

end;

procedure time1.Execute;

begin

{ Place thread code here }

repeat

synchronize(updatetimer);

application.ProcessMessages

until terminated

end;

end.

В основной программе, как и обычно, добавляем ссылки на модули потоков в оператор USES и объявляем две глобальные переменные-потоки:

var

Form1: TForm1;

thread1:time1;

thread2:time2;

При создании формы следует создать потоки, но не запускать их (параметр True метода Create):

procedure TForm1.FormCreate(Sender: TObject);

begin

doublebuffered:=true;

thread1:=time1.Create(true);

thread1.FreeOnTerminate:=true;

thread2:=time2.Create(true);

thread2.FreeOnTerminate:=true

end;

В обработчике нажатия кнопки зальем всю картинку черным цветом и запустим оба потока (метод Resume):

procedure TForm1.Button1Click(Sender: TObject);

begin

with image1.Canvas do

begin

brush.Color:=clBlack;

fillrect(image1.ClientRect)

end;

thread1.Resume;

thread2.Resume

end;

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

Теперь добавим на форму два компонента типа TRadioGroup. Зададим в каждом из них семь вариантов (свойство Columns) и пронумеруем варианты от 1 до 7 (свойство Items). Установим текущим элементом первый (свойство ItemIndex установить в ноль). Эти компоненты будут переключать приоритеты работы потоков. Поскольку оба потока переключаются аналогично, следует написать отдельную процедуру, чтобы избежать повторения кода:

procedure SetPriority(i:longint;t:tThread);

begin

case i of

0: t.Priority:=tpIdle;

1: t.Priority:=tpLowest;

2: t.Priority:=tpLower;

3: t.Priority:=tpNormal;

4: t.Priority:=tpHigher;

5: t.Priority:=tpHighest;

6: t.Priority:=tpTimeCritical

end

end;

На вход процедуре SetPriority подаются целое число – номер выбранного пункта в компоненте TRadioGroup и поток, приоритет которого меняется.

В обработчиках события OnClick объектов RadioGroup пишем:

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin

SetPriority(RadioGroup1.ItemIndex,thread1)

end;

procedure TForm1.RadioGroup2Click(Sender: TObject);

begin

SetPriority(RadioGroup2.ItemIndex,thread2)

end;

Теперь, запустив программу, попробуем изменять приоритеты потоков. Четко видно, что при снижении приоритета "белого" потока картинка заполняется черными точками и наоборот, пир торможении "черного" картинка белеет.