Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт по лабораторным работам.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
397.82 Кб
Скачать

Программа работы:

  1. Ознакомиться с технологией синхронизации процессов с помощью объектов-событий.

  2. Ознакомиться со структурой функций, применяемых для создания и управления объектами-событиями в ОС Windows.

  3. Спланировать алгоритмы процессов, работу которых требуется синхронизировать.

  4. Подготовить в соответствии с заданием и алгоритмами программы.

  5. Выявить и исправить ошибки, создать удобный интерфейс, расставить по тексту программ комментарии.

  6. Провести испытания и продемонстрировать работу программы преподавателю.

Листинг заголовочного файла программы “source”:

unit Gen;

interface

uses

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

Dialogs, StdCtrls, Menus;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

procedure FormCreate(Sender: TObject);

procedure Memo1Change(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

KeyPress:THandle;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Memo1.Text:='';

KeyPress:=CreateEvent(nil,false,true,'Press');

end;

procedure TForm1.Memo1Change(Sender: TObject);

begin

SetEvent(KeyPress);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Close;

end;

end.

Листинг исполняемого файла программы “source”:

bject Form1: TForm1

Left = 248

Top = 233

Width = 323

Height = 168

Caption = 'Передатчик'

Color = clBtnFace

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'MS Sans Serif'

Font.Style = []

OldCreateOrder = False

OnCreate = FormCreate

PixelsPerInch = 96

TextHeight = 13

object Memo1: TMemo

Left = 8

Top = 8

Width = 297

Height = 89

Lines.Strings = (

'Memo1')

TabOrder = 0

OnChange = Memo1Change

end

object Button1: TButton

Left = 8

Top = 104

Width = 297

Height = 25

Caption = 'ЗАКРЫТЬ'

TabOrder = 1

OnClick = Button1Click

end

end

Листинг заголовочного файла программы “dest”:

program Dest;

{$APPTYPE CONSOLE}

uses

SysUtils,

Windows;

var

KeyPress,ClosePr:THandle;

Value1,Value2:Integer;

begin

{ TODO -oUser -cConsole Main : Insert code here }

KeyPress := OpenEvent(SYNCHRONIZE, true, 'Press');

ClosePr := OpenEvent(SYNCHRONIZE, true, 'CloseProg');

while (WaitForSingleObject(KeyPress,infinite)=WAIT_OBJECT_0)

do

begin

write('*');

end;

end.

Результат работы программы:

Ответы на контрольные вопросы:

1. Что представляет собой событие?

Событие представляет собой объект, который может находиться в отмеченном или неотмеченном состоянии.

2.Перечислите функции, необходимые для управления объектами – событиями.

CreateEvent(),SetEvent(), ResetEvent(), PulseEvent(),OpenEvent()

3. Может ли одно событие использоваться сразу несколькими процессами? Как при этом идентифицируются объекты – события?

Для того, чтобы событием могли пользоваться задачи, созданные разными процессами, необходимо с помощью параметра lpName задать имя объекта – события.

Выполнил………………………………………………………….Погодаев А.М.

Преподаватель……………………………………………………….Мохов В.А.

Лабораторная работа № 5

Использование критических секций для доступа к ресурсам

Цель: освоить технологию синхронизации задач с помощью механизма критических секций в среде ОС Windows.

Оборудование: ПЭВМ IBM PC-AT 486 и выше.

Программные средства: ОС Windows (95/98/2000/, NT), Delphi 3.* (4.*, 5.*,6.*, 7*), файлы справочной документации интегрированной среды Delphi.

Задание

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

Листинг программы:

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, ExtCtrls, ImgList;

type

TForm1 = class(TForm)

Button1: TButton;

ListBox1: TListBox;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

procedure ThreadDone(Sender: TObject);

public

{ Public declarations }

end;

TFooThread=class(TThread)

protected

procedure Execute; override;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

const MaxSize= 128;

var

NextNumber: Integer = 0;

DoneFlags: Integer = 0;

GlobalArray: array[1..MaxSize] of Integer;

function GetNextNumber: Integer;

begin

Result:=NextNumber;

Inc(NextNumber);

end;

procedure TFooThread.Execute;

var i: integer;

begin

OnTerminate:= Form1.ThreadDone;

for i:= 1 to MaxSize do

begin

GlobalArray[i]:= GetNextNumber;

Sleep(30);

end;

end;

procedure TForm1.ThreadDone(Sender: TObject);

var i: integer;

begin

inc(DoneFlags);

if DoneFlags = 2 then

for i:=1 to MaxSize do

Listbox1.Items.Add(IntToStr(GlobalArray[i]));

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

TFooThread.Create(False);

TFooThread.Create(False);

TFooThread.Create(False);

end;

end.