Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, unit2, unit3, ComCtrls;
Type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
Button2: TButton;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
TrackBar1: TTrackBar;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
procedure RadioButton4Click(Sender: TObject);
procedure RadioButton5Click(Sender: TObject);
procedure RadioButton6Click(Sender: TObject);
Var
Private
{ Private declarations }
Public
{ Public declarations }
end;
Var
Form1: TForm1;
T1: Tthread1;
T2: Tthread2;
Implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Begin
T1:= Tthread1.Create(False);
T2:= Tthread2.Create(False);
RadioButton2.Checked:= True;
RadioButton5.Checked:= True;
Button1.Enabled:= False;
end;
procedure TForm1.Button2Click(Sender: TObject);
Begin
T1.suspend;
T2.suspend;
T1.Terminate;
T2.Terminate;
form1.Close;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
Begin
T1.Priority:= tpLower;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
Begin
T1.Priority:= tpNormal;
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
Begin
T1.Priority:= tpHigher;
end;
procedure TForm1.RadioButton4Click(Sender: TObject);
Begin
T2.Priority:= tpLower;
end;
procedure TForm1.RadioButton5Click(Sender: TObject);
Begin
T2.Priority:= tpNormal;
end;
procedure TForm1.RadioButton6Click(Sender: TObject);
Begin
T2.Priority:= tpHigher;
end;
End.
Листинг 1.2(Unit2):
unit Unit2;
Interface
Uses
Classes;
Var
i, j: integer;
Type
TThread1 = class(TThread)
Private
{ Private declarations }
Protected
procedure Execute; override;
procedure Struggle;
end;
Implementation
uses unit1;
procedure TThread1.Struggle;
Begin
form1.trackbar1.position:= 75;
end;
procedure TThread1.Execute;
Begin
FreeOnTerminate:= True;
Repeat
for I:= 1 to 50000 do
Begin
j:= round((i + 1) / (i));
end;
Synchronize(struggle);
until terminated;
end;
End.
Листинг 1.3(Unit3):
unit Unit3;
Interface
Uses
Classes;
Var
i, j: integer;
Type
TThread2 = class(TThread)
Private
{ Private declarations }
Protected
procedure Execute; override;
procedure Struggle;
end;
Implementation
uses unit1;
procedure TThread2.Struggle;
Begin
form1.trackbar1.position:= 25;
end;
procedure TThread2.Execute;
Begin
FreeOnTerminate:= True;
Repeat
for I:= 1 to 50000 do
Begin
j:= round((i + 1) / (i));
end;
Synchronize(struggle);
until terminated;
end;
End.
Результат работы программы:
Рис. 1 Результат работы программы.
2. Создайте два потока, считающие до 50000 и выводящие результат в компонент TLabel на форме. Один из потоков должен быть синхронизирован с главным потоком приложения, а второй нет. Для этого, выполните следующие действия.
Листинг 2.1(Unit1):
unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2, unit3, ComCtrls, AppEvnts, ExtCtrls;
Type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
end;
Var
Form1: TForm1;
T1: TThread1;
T2: TThread2;
i: integer;
Implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Begin
t1:= TThread1.Create(false);
button1.Enabled:= false;
end;
procedure TForm1.Button2Click(Sender: TObject);
Begin
t2:= TThread2.Create(false);
button2.Enabled:= false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
Begin
if t1 <> nil then
Begin
if not t1.Suspended then t1.suspend;
t1.terminate;
end;
if t2 <> nil then
Begin
if not t2.Suspended then t2.suspend;
t2.terminate;
end;
end;
End.
Листинг 2.2(Unit2):
unit Unit2;
Interface
Uses
Classes;
Var
I, j: integer;
Type
TThread1 = class(TThread)
Private
{ Private declarations }
Protected
procedure Execute; override;
procedure Count;
end;
Implementation
uses unit1, sysutils;
procedure TThread1.Execute;
Begin
FreeOnTerminate:= True;
for I:= 1 to 50000 do
Begin
j:= round((i + 1) / (i));
count;
end;
end;
procedure TThread1.Count;
Begin
form1.label1.caption:= inttostr(i);
Form1.ProgressBar1.Position:= i;
form1.Refresh;
end;
End.
Листинг 2.3(Unit3):
unit Unit3;
Interface
Uses
Classes;
Var
i, j: integer;
Type
TThread2 = class(TThread)
Private
{ Private declarations }
Protected
procedure Execute; override;
procedure Count;
end;
Implementation
uses unit1, sysutils;
procedure TThread2.Execute;
Begin
FreeOnTerminate:= True;
for I:= 1 to 50000 do
Begin
j:= round((i + 1) / (i));
synchronize(count);
end;
end;
procedure TThread2.Count;
Begin
form1.label2.caption:= inttostr(i);
form1.ProgressBar2.Position:= i;
form1.Refresh;
end;
End.
Результат работы программы:
Рис. 2 Результат работы программы.
3. Напишите программу, в которой два потока работая параллельно, генерируют в цикле (по 50 итераций) последовательность целых чисел: первый поток – отрицательные, второй – положительные числа.
Листинг 3.1(Unit1):
unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Unit2, Unit3;
Type
TForm1 = class(TForm)
Memo1: TMemo;
BStart: TButton;
ProgressBar1: TProgressBar;
BResult: TButton;
procedure FormCreate(Sender: TObject);
procedure BStartClick(Sender: TObject);
procedure BResultClick(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
end;
Var
Form1: TForm1;
arr: array [1..100] of integer;
j: integer;
T1: Tthread1;
T2: Tthread2;
Implementation
{$R *.dfm}
procedure TForm1.BResultClick(Sender: TObject);
Begin
for j:= 1 to 100 do
Memo1.Lines.Add('arr['+IntToStr(j)+'] = '+IntToStr(arr[j]));
end;
procedure TForm1.BStartClick(Sender: TObject);
Begin
ProgressBar1.Position:= 0;
j:= 0;
Memo1.Clear;
T1:= Tthread1.Create(False);
T2:= Tthread2.Create(False);
end;
procedure TForm1.FormCreate(Sender: TObject);
Begin
Memo1.Clear;
end;
End.
Листинг 3.2(Unit2):
unit Unit2;
Interface
Uses
Classes;
Type
Tthread1 = class(TThread)
Private
{ Private declarations }
Protected
procedure Execute; override;
procedure Loading;
end;
Implementation
uses Unit1;
procedure Tthread1.Loading;
Begin
if j <= 100 then
Begin
inc(j);
arr[j]:= j;
Form1.ProgressBar1.Position:= j;
sleep(1);
End
else T1.Terminate;
end;
procedure Tthread1.Execute;
Begin
Repeat
Synchronize(Loading);
until terminated;
end;
End.
Листинг 3.3(Unit3):
unit Unit3;
Interface
Uses
Classes;
Type
Tthread2 = class(TThread)
Private
{ Private declarations }
Protected
procedure Execute; override;
procedure Loading;
end;
Implementation
uses Unit1;
procedure Tthread2.Loading;
Begin
if j <= 100 then
Begin
inc(j);
arr[j]:= -j;
Form1.ProgressBar1.Position:= j;
sleep(1);
End
else T2.Terminate;
end;
procedure Tthread2.Execute;
Begin
Repeat
Synchronize(Loading);
until terminated;
end;
End.
Результат работы программы:
Рис. 3 Результат работы программы.
Мордовский государственный университет имени Н.П.Огарёва
Специальность: АСОИиУ
ЛАБОРАТОРНАЯ РАБОТА
по операционным системам
Получение информации о процессах и потоках
ЛР – 02069964 – ОС – 04 – 12
лабораторная работа № 4
ВЫПОЛНИЛ: ПРОВЕРИЛ:
студенты 241 группы: ____________ 03.04.2012
____________03.04.2012
Алексаев А.Ф. Савкина А.В.
Самылкин А.Д.
Саранск 2012