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

Interface

uses Classes;

type

TMyThread=class(TThread)

private

{ Private declarations }

protected

procedure Execute;override;

public

Count:Integer;

end;

Implementation

{ TMyThread }

procedure TMyThread.Execute;

var

I,Total:Integer;

begin

while True do

begin

Total:=0;

for I:=1 to 10000 do Inc(Total,Random(MaxInt));

Inc(Count);

end;

end;

end.

  1. Командой Проект=>Компилировать код модуля MyThread.pas компилируется в файл MyThread.dcu, сохраняемый в папке проекта. Внимание, при выполнении следующих заданий необходимо:

  • в коде модуля формы в строку uses добавить ссылку на модуль MyThread,

  • компилированный файл модуля MyThread.dcu скопировать в папку нового проекта.

Задание 2

Создать программу, использующую две параллельные нити с изменяемыми приоритетами. Проект – приложение. Диапазон изменения приоритетов 0..4. В каждом потоке выполняются одинаковые процессы:

  • по сигналу таймера сбрасывается счетчик числа циклов вычислений,

  • на каждом интервале таймера циклически повторяются вычисление и инкремент счетчика числа вычислений,

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

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

Для управления потоками создаем приложение, форма которого представлена на рис. 20 .5. Файлы проекта будем сохранять в папке 20_2.

рис. 20.5. Форма задания 2 на стадии конструирования

Для формы определим надпись «Тест потоков». Для каждого из двух потоков использованы 4 компоненты:

  • Метка Label для заголовка поля вывода.

  • Метка Label для вывода данных о числе вычислений в потоке.

  • Метка Label для заголовка регулятора.

  • Регулятор TrackBar для изменения приоритета потока.

Компоненты первого потока (Label1, Label3, Label5, TrackBar1) размещены в левой части окна формы, а компоненты второго потока (Label2, Label4, Label6, TrackBar2) – в правой. В форму помещен также компонент таймера Timer1 (он виден только при конструировании формы).

В модуле формы определены процедуры:

  1. procedure FormCreate(Sender:TObject). Она при активизации формы создает и немедленно запускает два потока Thread1 и Thread2, задавая для них самый низкий приоритет.

  2. procedure Timer1Timer(Sender:TObject). Она в начале каждого временного интервала таймера переносит значения счетчиков циклов вычислений в потоках Thread1.Count и Thread2.Count в поля меток Label5 и Label6, после чего обнуляет значения Thread1.Count и Thread2.Count.

  3. procedure TrackBar1Change(Sender:TObject). Она в ответ на перемещения ползунков регуляторов TrackBar1 и TrackBar2 меняет приоритет потоков. Один и тот же обработчик события используется для двух регуляторов, он изменяет приоритет того потока, от чьего регулятора получено сообщение.

Листинг модуля формы

unit Prg_20_2_;

Interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, ComCtrls, StdCtrls, ExtCtrls, MyThread;

type

TForm1=class(TForm)

Edit1:TEdit;

Edit2:TEdit;

Timer1:TTimer;

Label1:TLabel;

Label2:TLabel;

TrackBar1:TTrackBar;

TrackBar2:TTrackBar;

Label3:TLabel;

Label4:TLabel;

procedure Timer1Timer(Sender:TObject);

procedure FormCreate(Sender:TObject);

procedure TrackBar1Change(Sender:TObject);

private

{ Private declarations }

public

{ Public declarations }

Thread1,Thread2:TSimpleThread;

end;

var

Form1: TForm1;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]