Механизм межзадачного взаимодействия с помощью семафоров

Автор: Пользователь скрыл имя, 17 Января 2011 в 21:52, лабораторная работа

Описание работы

Семафор – это защищенная переменная, значение которой можно опрашивать и изменять с помощью специальных операций. Двоичные семафоры принимают два значения («0» и «1»), считающие семафоры (семафоры со счетчиками) принимают целые неотрицательные значения.

Работа содержит 1 файл

Лабораторная работа готовая.doc

— 302.00 Кб (Скачать)

Листинг

      (модуль 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;cl:tcolor); 

      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]:=200;mas[1,3]:=56;

        mas[2,1]:=200;mas[2,2]:=100;mas[2,3]:=7;

        mas[3,1]:=300;mas[3,2]:=150;mas[3,3]:=6; 

        randomize;

      { repeat}

          jj:=mas[i,1];

          sleep(jj);

          getsystemtime(x1);

          WaitForSingleObject(Semaphore , infinite);

          getsystemtime(x2);

          UpdateGraphic(1,round(jj/k),30,cllime);

          kk:=(x2.wMinute-x1.wMinute)*60000+(x2.wSecond-x1.wSecond)*1000+(x2.wMilliseconds-x1.wMilliseconds);

          if kk>0 then UpdateGraphic(1,round(kk/k),20,clblue);

          if pos[3].X<pos[1].X then UpdateGraphic(3,(pos[1].X-pos[3].X),40,clYellow);

          j:=mas[i,2];

          sleep(j);

      {  inc(i);}

          x:=mas[i,3];

          WriteText:='---1---'+IntToStr(Self.ThreadID)+'-----X='+inttostr(x)+'-------Tраб.='+inttostr(jj)+'-------Tраб.кр.='+inttostr(j)+'-------Tож.='+inttostr(kk);

          UpdateGraphic(1,round(j/k),40,clred);

          UpdateGraphic(3,round(j/k),20,claqua);

          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[1,3]:=55;

        mas[2,1]:=100;mas[2,2]:=50;mas[2,3]:=66;

        mas[3,1]:=250;mas[3,2]:=125;mas[3,3]:=77; 

        randomize;

      {  repeat}

          jj:=mas[i,1];

          sleep(jj);

          getsystemtime(x1);

          WaitForSingleObject(Semaphore , infinite);

          getsystemtime(x2);

          UpdateGraphic(2,round(jj/k),30,cllime);

          kk:=(x2.wMinute-x1.wMinute)*60000+(x2.wSecond-x1.wSecond)*1000+(x2.wMilliseconds-x1.wMilliseconds);

          if kk>0 then UpdateGraphic(2,round(kk/k),20,clblue);

          if pos[3].X<pos[2].X then UpdateGraphic(3,(pos[2].X-pos[3].X),40,clYellow);

          j:=mas[i,2];

          sleep(j);

      {    inc(i);}

          x:=mas[i,3];

          WriteText:='---2---'+IntToStr(Self.ThreadID)+'-----X='+inttostr(x)+'-------Tраб.='+inttostr(jj)+'-------Tраб.кр.='+inttostr(j)+'-------Tож.='+inttostr(kk);

          UpdateGraphic(2,round(j/k),40,clred);

          UpdateGraphic(3,round(j/k),20,clFuchsia);

          ReleaseSemaphore(Semaphore, 1, nil);

          Synchronize(UpdateListBox);

      {  until i>10;}

      end; 

      end; 

      procedure Thread1.UpdateListBox;

      begin

        Form1.ListBox1.Items.Add(WriteText);

      end; 

      procedure Thread2.UpdateListBox;

      begin

        Form1.ListBox1.Items.Add(WriteText);

      end; 

      procedure UpdateGraphic(n,dx,dy:integer;cl:tcolor);

      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]-dy));

            pos[n]:=PenPos;

          end;

      end; 

      end.

Информация о работе Механизм межзадачного взаимодействия с помощью семафоров