- •Передача данных между процессами посредством сообщений
- •Задание
- •Программа работы
- •Использованные компоненты и методы программы “Source”:
- •Листинг программы “Dest” – приёмник сообщений
- •If not r then ShowMessage('Ошибка передачи сообщения.');
- •Использованные компоненты и методы:
- •Результат работы программ
- •Листинг заголовочного файла программы:
- •Лабораторная работа №2 Создание, запуск и управление процессами в многозадачной ос.
- •Листинг исполняемого файла программы:
- •Результат работы программы:
- •Листинг заголовочного файла программы:
- •Листинг исполняемого файла программы:
- •Результат работы программы:
- •Ответы на контрольные вопросы:
- •Лабораторная работа № 4 Синхронизация задач с помощью событий.
- •Программа работы:
- •Листинг заголовочного файла программы “source”:
- •Листинг исполняемого файла программы “source”:
- •Листинг заголовочного файла программы “dest”:
- •Результат работы программы:
- •Результат работы программы:
- •Ответы на контрольные вопросы:
- •Результат работы программы:
- •Ответы на контрольные вопросы:
Результат работы программы:
Ответы на контрольные вопросы:
1. В чем заключается суть проблемы синхронизации работы нитей?
Суть проблемы состоит в том, что каждая операция выполняется в рамках собственной нити и операционная система вольна обращаться с ними как с совершенно не связанными задачами.
2. Что представляет собой критическая секция?
Критическая секция – это некоторый участок кода, который в каждый момент времени может выполняться только одной из нитей.
3. Укажите состав функций, необходимых для манипулирования критическими секциями.
InitializeCriticalSection(), EnterCriticalSection(), LeaveCriticalSection(), DeleteCriticalSection().
Выполнил………………………………………………………………Погодаев А.М.
Преподаватель……………………………………………………………Мохов В.А.
Лабораторная работа № 6
Синхронизация задач с использованием семафоров
Цель: освоить технологию синхронизации задач с использованием семафоров в среде ОС Windows.
Оборудование: ПЭВМ IBM PC-AT 486 и выше.
Программные средства: ОС Windows (95/98/2000/, NT), Delphi 3.* (4.*, 5.*,6.*), файлы справочной документации интегрированной среды Delphi.
Задание
Разработать программу для заполнения массива несколькими задачами одновременно, выполнив синхронизацию задач с использованием механизма семафоров.
Листинг программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
RadioButton1: TRadioButton;
procedure Button1Click(Sender: TObject);
private
procedure ThreadsDone(Sender:TObject);
{ Private declarations }
public
{ Public declarations }
end;
type
TFooThread = class(TTHread)
protected
procedure Execute;override;
end;
var
Form1: TForm1;
hnd: THandle;
implementation
{$R *.dfm}
const
MaxSize = 128; //Размер массива
var NextNumber:Integer = 0;
DoneFlags:Integer = 0;
GlobalArray:array[1..MaxSize] of Integer;
//увеличиваем NextNumber на 1 и возвращаем это значение
function GetNextNumber:Integer;
begin
Result := NextNumber;
Inc(NextNumber);
end;
procedure TFooThread.Execute;
var
i:integer;
r:DWORD;
begin
OnTerminate:= Form1.ThreadsDone;
if (Form1.RadioButton1.Checked = False) //без синхронизации
then
begin
for i:=1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber;
Sleep(5);
end;
end
else //с синхронизацией
begin
repeat
r := WaitForSingleObject(hnd, INFINITE); //семафор-1
until r = WAIT_OBJECT_0;
for i:=1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber;
Sleep(10);
end;
ReleaseSemaphore(hnd, 1, nil); //семафор+1
end;
end;
procedure TForm1.ThreadsDone(Sender:TObject);
var
i:integer;
begin
Form1.Button1.Visible:=False;
if RadioButton1.Checked=false //без синхронизации
then
begin
inc(DoneFlags);
if (DoneFlags = 3)
then
for i:=1 to MaxSize do
ListBox1.Items.Add(IntToStr(GlobalArray[i]));
end
else //с синхронизацией
begin
inc(DoneFlags);
if (DoneFlags = 3)
then
begin
for i:=1 to MaxSize do
ListBox1.Items.Add(IntToStr(GlobalArray[i]));
CloseHandle(hnd);
end;
end;
end;
//По нажатию клавиши создать нити
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Form1.RadioButton1.Checked = False) //без синхронизации
then
begin
TFooThread.Create(False);
TFooThread.Create(False);
TFooThread.Create(False);
end
else
begin //с синхронизацией
hnd := 0;
hnd := CreateSemaphore(nil, 1, 1, nil);
TFooThread.Create(False);
TFooThread.Create(False);
TFooThread.Create(False);
end;
end;
end.
