Автор работы: Пользователь скрыл имя, 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
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:
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.
Form2.Show;
end;
procedure Vivod;
var i:integer;
begin
Form1.StringGrid1.RowCount:=
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_
Cells[2,i]:=FloattoStr(Ar[i].
Cells[3,i]:=IntToStr(Ar[i].Ko_
Cells[4,i]:=IntToStr(Ar[i].
end;
end;
end;
procedure TForm1.StringGrid1Click(
begin
Edit1.Text:=StringGrid1.Cells[
end;
function Zaproc():integer; // Поток Server
var
a:String;
j,i,k:integer;
LArrI,LArrO:array [1..255] of Apteka;
begin
// Создаем именнованный канал
HNamePipe:=CreateNamedPipe('\\
// Ждем подключения КлИенТа
ConnectNamedPipe(HNamePipe,
While true do
begin
// Ждем освобождения CriticalSection
// если свободен захватываем и выполняем сам алгоритм
EnterCriticalSection(
ReadFile(HNamePipe,a,SizeOf(a)
ReadFile(HNamePipe,k,SizeOf(k)
ReadFile(HNamePipe,LArrI,k*
j:=0;
for i:=1 to k do
begin
If AnsiLowerCase(a)=
end;
WriteFile(HNamePipe,j,SizeOf(
if
j>0 then WriteFile(HNamePipe,LArrO,j*
// Освобождаем CriticalSection
LeaveCriticalSection(
// Ждем, чтобы КлИенТ успел захватить 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),
WriteFile(Hfile,HiMass,SizeOf(
WriteFile(Hfile,Ar,HiMass*
LeaveCriticalSection(
// Ждем
освобождения критической
// если свободна захватываем
EnterCriticalSection(
ReadFile(Hfile,LHiMass,SizeOf(
If LHiMass>0 then
begin
ReadFile(Hfile,Larr,LHiMass*
StringGrid1.RowCount:=LHiMass+
for i:=1 to LhiMass do
begin
with StringGrid1 do
begin
Cells[0,i]:=Larr[i].Name_L;
Cells[1,i]:=IntToStr(Larr[i].
Cells[2,i]:=FloattoStr(Larr[i]
Cells[3,i]:=IntToStr(Larr[i].
Cells[4,i]:=IntToStr(Larr[i].
end;
end;
Edit1.Text:='';
end
else
begin
StringGrid1.RowCount:=LHiMass+
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(
//Захватываем критическую секцию
EnterCriticalSection(
//Создаем поток Server
HThreads:=CreateThread(nil,
//Ждем создание потока
sleep(10);
//Подключаемся к серверу
Hfile:=CreateFile('\\.\pipe\
// Задаем начальное
значение указателя длины
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.
Dec(HiMass);
for i:=Iden to HiMass do begin Ar[i]:=Ar[i+1]; Ar[i].iden:=i; end;
Vivod;
end;
end. //
end implemintation
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:='';