Построение оконных мультизадачных приложений, организация обмена данными между процессами

Автор работы: Пользователь скрыл имя, 24 Сентября 2011 в 12:57, курсовая работа

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

В курсовом проекте предлагается спроектировать и разработать программу, обеспечивающую мультизадачность. В программе необходимо предусмотреть два визуальных процесса: один для ввода с контролем и корректировки данных (выполнять все виды корректировки – добавление, удаление, замену) и вывода результатов указанного в задании запроса и второй - для выполнения запроса.

Содержание работы

1.ЗАДАНИЕ 3
2.ВВЕДЕНИЕ 4
3. ПРОБЛЕМЫ ПРИ СИНХРОНИЗАЦИИ ПОТОКОВ 5
3.1 СИНХРОНИЗАЦИЯ 6
4. ФУНКЦИИ WINAPI32 7
4.1 КРИТИЧЕСКИЕ СЕКЦИИ 7
4.2 ПОТОКИ 8
4.3 КАНАЛЫ 9
5.ГРАФИЧЕСКОЕ ОТОБРАЖЕНИЕ ВЗАИМОДЕЙСТВИЯ ПОТОКОВ И ОБМЕНА ДАННЫМИ МЕЖДУ НИМИ 12
6. ОПИСАНИЕ ОСНОВНЫХ СОБЫТИЙ ПРИЛОЖЕНИЯ 13
7.РЕЗУЛЬТАТЫ ТЕСТОВЫХ ПРОГОНОВ 14
8.ЛИСТИНГ ПРОГРАММЫ 18
8.1 UNIT1 18
8.2 UNIT2 26
9. ВЫВОД 29
10. СПИСОК ЛИТЕРАТУРЫ 30

Файлы: 1 файл

курсавая работа по Системному программному обеспечению.doc

— 445.50 Кб (Скачать файл)

        Name_L:string[50];

        N_Ap:word;

        cena:Real;

        Ko_vo:word;

        iden:integer;

        end; 

var

  Form1: TForm1;

  Ar:array[1..255]of Apteka;

  Ap:Apteka;

  HiMass,Iden:integer;

  HThreads,Hfile:THandle;

  CriticalSection:TRTLCriticalSection;

  ThreadID,IDFile:Dword;

  x,HNamePipe:Cardinal;

implementation

  uses Unit2;

{$R *.dfm} 

procedure OpenRaz;

begin

Inc(HiMass);

Ar[1].Name_L:='Анальгин';

Ar[1].N_Ap:=2;

Ar[1].cena:=75;

Ar[1].Ko_vo:=17;

Ar[1].iden:=HiMass; 

inc(HiMass);

Ar[2].Name_L:='Йод';

Ar[2].N_Ap:=3;

Ar[2].cena:=16;

Ar[2].Ko_vo:=8;

Ar[2].iden:=HiMass; 

inc(HiMass);

Ar[3].Name_L:='Кальций';

Ar[3].N_Ap:=4;

Ar[3].cena:=15.50;

Ar[3].Ko_vo:=14;

Ar[3].iden:=HiMass; 

inc(HiMass);

Ar[4].Name_L:='Спирт';

Ar[4].N_Ap:=5;

Ar[4].cena:=56;

Ar[4].Ko_vo:=18;

Ar[4].iden:=HiMass; 

inc(HiMass);

Ar[5].Name_L:='Пурген';

Ar[5].N_Ap:=6;

Ar[5].cena:=26;

Ar[5].Ko_vo:=5;

Ar[5].iden:=HiMass; 

inc(HiMass);

Ar[6].Name_L:='Но-Шпа';

Ar[6].N_Ap:=7;

Ar[6].cena:=80;

Ar[6].Ko_vo:=25;

Ar[6].iden:=HiMass; 

 inc(HiMass);

Ar[7].Name_L:='Активированный уголь';

 Ar[7].N_Ap:=8;

Ar[7].cena:=25;

Ar[7].Ko_vo:=12;

Ar[7].iden:=HiMass; 

inc(HiMass);

Ar[8].Name_L:='Аэрозоль';

Ar[8].N_Ap:=9;

Ar[8].cena:=56;

Ar[8].Ko_vo:=10;

Ar[8].iden:=HiMass; 

inc(HiMass);

Ar[9].Name_L:='Кальций';

Ar[9].N_Ap:=4;

Ar[9].cena:=15.50;

Ar[9].Ko_vo:=14;

Ar[9].iden:=HiMass; 

inc(HiMass);

Ar[10].Name_L:='Кальций';

Ar[10].N_Ap:=4;

Ar[10].cena:=15.50;

Ar[10].Ko_vo:=14;

Ar[10].iden:=Himass; 
 
 

inc(HiMass);

Ar[11].Name_L:='Кальций';

Ar[11].N_Ap:=4;

Ar[11].cena:=15.50;

Ar[11].Ko_vo:=14;

Ar[11].iden:=Himass;

inc(HiMass);

Ar[12].Name_L:='Кальций';

Ar[12].N_Ap:=4;

Ar[12].cena:=15.50;

Ar[12].Ko_vo:=14;

Ar[12].iden:=Himass;

inc(HiMass);

Ar[13].Name_L:='Кальций';

Ar[13].N_Ap:=4;

Ar[13].cena:=15.50;

Ar[13].Ko_vo:=14;

Ar[13].iden:=Himass;

end;  // end OpenRaz 

procedure TForm1.IzmenitClick(Sender: TObject);

begin

  Iden:=StrToInt(StringGrid1.Cells[4,StringGrid1.Row]);

  Form2.Show;

end; 

procedure Vivod;

var i:integer;

begin

Form1.StringGrid1.RowCount:=HiMass+1;

for i:=1 to HiMass do begin

   with Form1.StringGrid1 do

    begin

      Cells[0,i]:=Ar[i].Name_L;

      Cells[1,i]:=IntToStr(Ar[i].N_Ap);

      Cells[2,i]:=FloattoStr(Ar[i].cena);

      Cells[3,i]:=IntToStr(Ar[i].Ko_vo);

      Cells[4,i]:=IntToStr(Ar[i].iden);

      end;

   end;

end; 
 
 

procedure TForm1.StringGrid1Click(Sender: TObject);

begin

  Edit1.Text:=StringGrid1.Cells[0,StringGrid1.Row];

end; 
 

function Zaproc():integer; // Поток Server

var

a:String;

j,i,k:integer;

LArrI,LArrO:array [1..255] of Apteka;

begin

// Создаем именнованный канал

  HNamePipe:=CreateNamedPipe('\\.\pipe\canal',PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE AND PIPE_READMODE_BYTE AND PIPE_WAIT,1,2000,2000,100,nil);

// Ждем подключения КлИенТа

  ConnectNamedPipe(HNamePipe,nil);

  While true do

   begin

   // Ждем освобождения CriticalSection

   // если свободен захватываем и выполняем сам алгоритм

     EnterCriticalSection(CriticalSection);

     ReadFile(HNamePipe,a,SizeOf(a),x,nil);

     ReadFile(HNamePipe,k,SizeOf(k),x,nil);

     ReadFile(HNamePipe,LArrI,k*SizeOf(Ap),x,nil);

     j:=0;

     for i:=1 to k do

      begin

        If AnsiLowerCase(a)=AnsiLowerCase(LArrI[i].Name_L)  then begin   inc(j); LArrO[j]:=LArrI[i];  end;

       end;

     WriteFile(HNamePipe,j,SizeOf(j),x,nil);

     if j>0 then WriteFile(HNamePipe,LArrO,j*SizeOf(Ap),x,nil);

     // Освобождаем CriticalSection

     LeaveCriticalSection(CriticalSection);

     // Ждем, чтобы КлИенТ успел захватить  CriticalSection ( избегаем тупика)

     sleep(10);

     end;

end; // end Zapros 
 
 
 
 
 

procedure TForm1.ZaprosClick(Sender: TObject);

var

st:string;

i,LHiMass:integer;

Larr:array [1..255] of Apteka;

begin

  st:=trim(Edit1.Text);

  if st='' then Vivod else

   begin

     WriteFile(Hfile,st,SizeOf(st),x,nil);

     WriteFile(Hfile,HiMass,SizeOf(HiMass),x,nil);

     WriteFile(Hfile,Ar,HiMass*SizeOf(Ap),x,nil);

     LeaveCriticalSection(CriticalSection); 

   // Ждем  освобождения критической секции

   // если  свободна захватываем

     EnterCriticalSection(CriticalSection);

     ReadFile(Hfile,LHiMass,SizeOf(LHiMass),x,nil);

     If LHiMass>0 then

      begin

        ReadFile(Hfile,Larr,LHiMass*SizeOf(Ap),x,nil);

        StringGrid1.RowCount:=LHiMass+1;

        for i:=1 to LhiMass do

         begin

           with StringGrid1 do

            begin

              Cells[0,i]:=Larr[i].Name_L;

              Cells[1,i]:=IntToStr(Larr[i].N_Ap);

              Cells[2,i]:=FloattoStr(Larr[i].cena);

              Cells[3,i]:=IntToStr(Larr[i].Ko_vo);

              Cells[4,i]:=IntToStr(Larr[i].iden);

              end;

           end;

           Edit1.Text:='';

        end

       else

         begin

           StringGrid1.RowCount:=LHiMass+2;

           with StringGrid1 do

            begin

              Cells[0,1]:='';

              Cells[1,1]:='';

              Cells[2,1]:='';

              Cells[3,1]:='';

              Cells[4,1]:='';

             end;

           end;

     end;

end; // end ZaprosClick 

procedure TForm1.FormCreate(Sender: TObject);  // КлИенТ 

begin

//Создаем объект критической секции

InitializeCriticalSection(CriticalSection);

//Захватываем критическую секцию

EnterCriticalSection(CriticalSection);

//Создаем поток  Server

HThreads:=CreateThread(nil,2000,@Zaproc,nil,0,ThreadID);

//Ждем создание  потока

sleep(10);

//Подключаемся  к серверу

 Hfile:=CreateFile('\\.\pipe\canal',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);

// Задаем начальное  значение указателя длины массива

 HiMass:=0; 

//Забиваем верхнюю панель StringGrida

with StringGrid1 do

begin

   Cells[0,0]:='Назваеие лекарства';

   Cells[1,0]:='Номер аптеки';

   Cells[2,0]:='Цена упаковки';

   Cells[3,0]:='Кол-во  упаковок';

   Cells[4,0]:='идентификатор';

  end;

  // Вводим  начальные значения в массив

OpenRaz;

//Забиваем StringGrid значениями из массива

Vivod;

end; 

procedure TForm1.DobavitClick(Sender: TObject);

begin

Iden:=0;

Form2.Show;

end; 

procedure TForm1.DelClick(Sender: TObject);

var i:integer;

begin

Iden:=StrToInt(StringGrid1.Cells[4,StringGrid1.Row]);

Dec(HiMass);

for i:=Iden to HiMass do begin Ar[i]:=Ar[i+1]; Ar[i].iden:=i; end;

Vivod;

end;

end.    // end implemintation 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

8.2 UNIT2

 

unit Unit2; 

interface 

uses

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

  Dialogs, StdCtrls, Mask; 

type

  TForm2 = class(TForm)

    Edit1: TEdit;

    Edit2: TEdit;

    Edit4: TEdit;

    Button1: TButton;

    Button2: TButton;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Edit3: TEdit;

    procedure FormShow(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Cline;

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Cline;

begin

   Edit1.Text:='';

   Edit2.Text:='';

   Edit3.Text:='';

Информация о работе Построение оконных мультизадачных приложений, организация обмена данными между процессами