
- •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 кроссплатформенного приложения
Implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text:=IntToStr(Thread1.Count);
Edit2.Text:=IntToStr(Thread2.Count);
Thread1.Count:=0;
Thread2.Count:=0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Thread1:=TSimpleThread.Create( False );
Thread1.Priority:=tpLowest;
Thread2:=TSimpleThread.Create( False );
Thread2.Priority:=tpLowest;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
I:Integer;
Priority: TThreadPriority;
begin
Priority := tpLowest;
for I:=0 to (Sender as TTrackBar).Position-1 do inc(Priority);
If Sender=TrackBar1
then Thread1.Priority:=Priority
else Thread2.Priority:=Priority;
end;
end.
На рис. 20 .6 показана форма приложения при исполнении программы. На каждом интервале таймера содержимое полей текста редакторов Edit1 и Edit2 меняется. По ним можно судить о скорости работы нитей. Скорость можно менять, изменяя приоритеты нитей. Скорости примерно одинаковы при равных приоритетах. Если это не так, то быстрее выполняется процесс с большим приоритетом.
рис. 20.6. Форма задания 2 при исполнении программы
Задание 3
Добавить в программу задания 2 средства останова, возобновления и переключения потоков. Проект – приложение. Для управления потоками с взаимодействием создаем приложение, форма которого представлена на рис. 20 .7. Файлы проекта будем сохранять в папке 20_3.
рис. 20.7. Форма задания 3 на этапе конструирования
Для формы определим надпись «Взаимодействие потоков». Использованы дополнительные компоненты:
Кнопки Button c надписями «Стоп» и «Пуск» для каждого потока.
Кнопка Button с надписью «Переключить».
Кнопки «Стоп1» и «Стоп2» приостанавливают потоки путем использования метода Suspend, а кнопки «Пуск1» и «Пуск2» их возобновляют методом Resume. Кнопка «Переключить» в случае работы только одного потока меняет сосотояние потоков на противоположное.
В модуле формы дополнительно определены процедуры:
procedure Button1Click(Sender: TObject). Она при нажатии кнопки «Стоп1» останавливает поток 1.
procedure Button2Click(Sender: TObject). Она при нажатии кнопки «Пуск1» возобновляет поток 1.
procedure Button3Click(Sender: TObject). Она при нажатии кнопки «Стоп2» останавливает поток 1.
procedure Button4Click(Sender: TObject). Она при нажатии кнопки «Пуск2» возобновляет поток 1.
procedure Button5Click(Sender: TObject). Она при нажатии кнопки «Переключение» меняет на противоположные состояния потоков.
Листинг модуля формы:
unit Prg_20_3_;
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;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Timer1Timer(Sender:TObject);
procedure FormCreate(Sender:TObject);
procedure TrackBar1Change(Sender:TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Thread1,Thread2:TSimpleThread;
end;
var
Form1: TForm1;