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




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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: