
- •12.Списки
- •Interface
- •Implementation
- •13.Модули
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •14.Таблицы
- •Interface
- •Implementation
- •15.Графика, отображение графиков функций
- •Interface
- •Implementation
- •Initialization
- •16.Графика, примитивы
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Initialization
- •17.Графика, растровые изображения и анимация
- •Interface
- •Implementation
- •Initialization
- •Interface
- •Implementation
- •18.Тестирование и отладка
- •19.Квадратное уравнение
- •Interface
- •20.Класс tThread
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •21.Класс tStream
- •Interface
- •Implementation
- •Initialization
- •Interface
- •Implementation
- •Initialization
- •22.Создание в Delphi кроссплатформенного приложения
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.
Командой Проект=>Компилировать код модуля 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 (он виден только при конструировании формы).
В модуле формы определены процедуры:
procedure FormCreate(Sender:TObject). Она при активизации формы создает и немедленно запускает два потока Thread1 и Thread2, задавая для них самый низкий приоритет.
procedure Timer1Timer(Sender:TObject). Она в начале каждого временного интервала таймера переносит значения счетчиков циклов вычислений в потоках Thread1.Count и Thread2.Count в поля меток Label5 и Label6, после чего обнуляет значения Thread1.Count и Thread2.Count.
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;