close

Вход

Забыли?

вход по аккаунту

?

labos 3

код для вставкиСкачать
Федеральное агентство по образованию РФ Белгородский Государственный Технологический Университет им В.Г.Шухова
Лабораторная работа № 3
Синхронизация потоков
Выполнил:
студент группы ПВ-31
Майлатов И.С.
Белгород 2013
СОДЕРЖАНИЕ ОТЧЕТА
1. Наименование лабораторной работы, ее цель.
2. Краткое изложение теоретических основ о потоках в ОС Windows.
3. Составить программу, которая включает функцию, с помощью которой приложение приостановит свою работу до завершения другого приложения. 4. Исследовать использование мьютексов и событий на конкретном примере. Использовать приложения LAB_OC_4_1 и LAB_OC_4_2, приведенные в папке ЛАБ_ОС_4. Разработать аналогичные приложения с использованием следующих методов синхронизации потоков:
ВариантМетод синхронизации7Мьютексы
5. Примеры разработанных приложений (результаты и тексты программ).
Синхронизация потоков
Цель работы: Получение практических навыков по использованию Win32 API для синхронизации процессов и потоков
Термин многозадачность (multitasking) или мультипрограммирование (multiprogramming), обозначает возможность управлять несколькими процессами (или несколькими потоками) на базе одного процессора. Многопроцессорной обработкой (multiprocessing) называется управление некоторым числом процессов или потоков на нескольких процессорах.
Компьютер может одновременно выполнять команды двух разных процессов только в многопроцессорной среде. Однако даже на одном процессоре с помощью переключения задач (task switching) можно создать впечатление, что одновременно выполняются команды нескольких процессов.
В старой 16-разрядной Windows существовал только один поток. Более того, в данной системе был реализован метод кооперативной (cooperative) многозадачности, который состоит в том, что каждое приложение само отвечает за высвобождение единственного системного потока, после чего могут выполняться другие приложения. Если программа выполняла задачи, требующие значительного времени, такие как форматирование гибкого диска, все другие загруженные приложения должны были ждать. А если программа, написанная с ошибками, входила в бесконечный цикл, то вся система становилась непригодной для использования ("зависала"), требовала перезагрузки с выключением питания.
Скриншоты программ
Программа №1
Программа №2
Текст программы №1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, PSAPI, TlHelp32, Grids, ExtCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Edit1: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
IpIdProcesses : array[0..1000] of DWORD;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var SnapShot : THandle;
Proc : TProcessEntry32;
i : dword;
begin
ListBox1.Clear;
// Снимок процессов
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Proc.dwSize := sizeof(TProcessEntry32);
i := 0;
// Для каждого процесса вывод
if Process32First(SnapShot, Proc) then
repeat
ListBox1.Items.Add(Proc.szExeFile);
IpIdProcesses[i] := Proc.th32ProcessID;
i:=i+1;
until not Process32Next(SnapShot, Proc);
CloseHandle(SnapShot);
end;
procedure TForm1.Button2Click(Sender: TObject);
var h : THandle;
rezult : dword;
begin
if ListBox1.ItemIndex < 0 then
Showmessage('выберите процесс')
else
begin
h := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or SYNCHRONIZE, true, IpIdProcesses[ListBox1.ItemIndex]);
rezult := WaitForSingleObject(h, StrToInt(Edit1.Text) * 1000);
case rezult of
WAIT_OBJECT_0 : ShowMessage('Объект находиться в состоянии Свободно');
WAIT_TIMEOUT : ShowMessage('Интервал ожидания истек');
WAIT_FAILED : ShowMessage('Ошибка');
end;
end;
end;
end.
Текст программы №2
Unit1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit2, Unit3;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.show;
form2.Edit1.Text:='0';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form3.Show;
form3.Edit1.Text:='0';
end;
end.
Unit 2 (Unit 3 Аналогичен)
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
HMutex : THandle;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
HMutex := CreateMutex(nil , false , PAnsiChar('mangust') );
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
timer1.Enabled:=true;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
timer1.Enabled:=false;
ReleaseMutex(HMutex);
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var i:integer;
k:Dword;
begin
k := WaitForSingleObject(HMutex , 8000);
case k of
WAIT_OBJECT_0 :
for i:=1 to 5 do begin
sleep(1000);
edit1.text := IntToStr(StrToInt(edit1.Text)+1);
edit1.Refresh;
end;
WAIT_TIMEOUT : ShowMessage('Èíòåðâàë âðåìåíè èñòåê');
WAIT_ABANDONED : ShowMessage('Îáúåêò íå áûë îñâîáîæäåí');
WAIT_FAILED : ShowMessage('Îøèáêà');
end;
ReleaseMutex(HMutex);
timer1.Enabled:=false;
timer1.Enabled:=true;
end;
end.
Документ
Категория
Рефераты
Просмотров
29
Размер файла
124 Кб
Теги
labor
1/--страниц
Пожаловаться на содержимое документа