Автор: Пользователь скрыл имя, 17 Января 2011 в 21:52, лабораторная работа
Семафор – это защищенная переменная, значение которой можно опрашивать и изменять с помощью специальных операций. Двоичные семафоры принимают два значения («0» и «1»), считающие семафоры (семафоры со счетчиками) принимают целые неотрицательные значения.
Листинг
(модуль
Writerthread.pas)
unit WriterThread;
interface
uses
Classes, Windows,
SysUtils, Graphics;
type
Thread1 = class(TThread)
private
{ Private declarations }
FWorkSemafor:integer;
FSleepDuration: Integer;
FWaitForDuration: Integer;
protected
WriteText: String;
procedure Execute; override;
procedure UpdateListBox;
public
property WorkSemafor: Integer write FWorkSemafor;
property SleepDuration: Integer write FSleepDuration;
property WaitForDuration: Integer write FWaitForDuration;
end;
Thread2 = class(TThread)
private
FWorkSemafor:integer;
FSleepDuration: Integer;
FWaitForDuration: Integer;
protected
WriteText: String;
procedure Execute; override;
procedure UpdateListBox;
public
property WorkSemafor: Integer write FWorkSemafor;
property SleepDuration: Integer write FSleepDuration;
property WaitForDuration: Integer write FWaitForDuration;
end;
procedure UpdateGraphic(n,dx,dy:integer;
implementation
uses main;
procedure Thread1.Execute;
var
mas:array[1..100,1..100] of integer;
WaitResult: Integer;
i,j,jj,kk: integer;
x1,x2:systemtime;
begin
{ i:=1;}
for i:=1 to 3 do
begin
mas[1,1]:=700;mas[1,2]:=
mas[2,1]:=200;mas[2,2]:=100;
mas[3,1]:=300;mas[3,2]:=150;
randomize;
{ repeat}
jj:=mas[i,1];
sleep(jj);
getsystemtime(x1);
WaitForSingleObject(Semaphore , infinite);
getsystemtime(x2);
UpdateGraphic(1,round(jj/k),
kk:=(x2.wMinute-x1.wMinute)*
if kk>0 then UpdateGraphic(1,round(kk/k),
if pos[3].X<pos[1].X then UpdateGraphic(3,(pos[1].X-pos[
j:=mas[i,2];
sleep(j);
{ inc(i);}
x:=mas[i,3];
WriteText:='---1---'+IntToStr(
UpdateGraphic(1,round(j/k),40,
UpdateGraphic(3,round(j/k),20,
ReleaseSemaphore(Semaphore, 1, nil);
Synchronize(UpdateListBox);
{ until i>10;}
end;
end;
procedure Thread2.Execute;
var
mas:array[1..100,1..100] of integer;
WaitResult: Integer;
i,j,jj,kk: integer;
x1,x2:systemtime;
begin
{ i:=1;}
for i:=1 to 3 do
begin
mas[1,1]:=800;mas[1,2]:=300;
mas[2,1]:=100;mas[2,2]:=50;
mas[3,1]:=250;mas[3,2]:=125;
randomize;
{ repeat}
jj:=mas[i,1];
sleep(jj);
getsystemtime(x1);
WaitForSingleObject(Semaphore , infinite);
getsystemtime(x2);
UpdateGraphic(2,round(jj/k),
kk:=(x2.wMinute-x1.wMinute)*
if kk>0 then UpdateGraphic(2,round(kk/k),
if pos[3].X<pos[2].X then UpdateGraphic(3,(pos[2].X-pos[
j:=mas[i,2];
sleep(j);
{ inc(i);}
x:=mas[i,3];
WriteText:='---2---'+IntToStr(
UpdateGraphic(2,round(j/k),40,
UpdateGraphic(3,round(j/k),20,
ReleaseSemaphore(Semaphore, 1, nil);
Synchronize(UpdateListBox);
{ until i>10;}
end;
end;
procedure Thread1.UpdateListBox;
begin
Form1.ListBox1.Items.Add(
end;
procedure Thread2.UpdateListBox;
begin
Form1.ListBox1.Items.Add(
end;
procedure UpdateGraphic(n,dx,dy:integer;
begin
with form1.Image1.Canvas do
begin
pen.Width:=1;
pen.Color:=clgray;
moveto(pos[n].X,pos[n].Y);
lineto(pos[n].X,(high[n]-dy));
pen.Width:=qwe;
pen.Color:=cl;
moveto(pos[n].X,(high[n]-dy));
lineto((pos[n].X+dx),(high[n]-
pos[n]:=PenPos;
end;
end;
end.
Информация о работе Механизм межзадачного взаимодействия с помощью семафоров