Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.17 Mб
Скачать

Int number;

Polnt p;

int dX;

bool leftRight;

ContrlRegion region;

bool lnContri;

// Номер объекта компонента

// Координаты объекта компонента

// Приращение координаты X

// Направление перемещения груза

П Ссылка на зону контроля

// Признак нахождения в зоне контроля

Random rand;

bool life;

bool run;

Thread thr;

int tlmePeriod= 100;

Warehouse leftWH;

Warehouse rightWH;

bool disposed= false;

// Ссылка на объект случайного числа

// Признак жизни потока

// Признак выполнения потока

// Ссылка на объект потока

// Временной интервал перемещения

// Ссылка на левый склад

// Ссылка на правый склад

И Признак освобождения ресурса

// Конструктор

public Lorry (int Number, intY, int DX, Warehouse LeftWII,

Warehouse RightWH, ContrlRegion Region)

{

number= Number; dX= DX; leftRight= true;

leftWH= LeftWH; rightWH= RightWH;

region= Region; inContrl= false; p= new Point ();

p.X= leftWH. Location.X+leftWH.Width + 1; p.Y= Y;

rand= new Random ( );

// Создать объект потока

run= true; life= true;

thr= new Thread (new ThreadStart (Moving));

thr.Start ();

>

// Свойство Number

public lnt Number {get {return number;»

/p/u Сblвicо йPсoтiвnоt PPooiinntt {get {return p ; »

// Свойство LeftRight

public bool LeftRight

{

set {leftRlght= value;>

get {return leftRight;}

>

// Свойство Running

public bool Running {get {return r u n ; »

|| Освободить ресурс

public void Dispose ( )

{

disposed= true;

>

// Завершить поток

public void Finish ( ) {llfe= false; thrJoin ( );}

// Приостановить поток

public void Stop ()

{

run= false;

// Возобновить поток

public void Run ( )

{

lock (this) // Создать синхронизируемый блок

{

run= true;

Monltor.Pulse (this); // Разблокировать поток

>

>

// Потоковая функция компонента

private void Moving ( )

{

<wh ile (life)

lock (this) // Создать синхронизируемый блок

{

if (I run)

Monitor.Wait (this); // Ожидать

// разблокировки

>

// Объект компонента достиг справа

// объекта левого склада

If (p,X <= leftWH.Locatlon.X+leftWH,Wldth)

{

Console.WriteLine ("Левая граница");

if (leftRight) // Пересылка слева направо

leftWH.Get ( ); // Загрузить груз

else

leftWH.Put ( ); // Выгрузить груз

dX= -dX;

>

// Объект компонента достиг слева

// объекта правого склада

if(p.X >= rightWH.Location.X)

{

Console.WriteLine ("Правая граница");

if (leftRight) // Пересылка слева направо

rightWH.Put ( ); // Выгрузить груз

else

rlghtWH.Get (); //Загрузитьгруз

dX= -dX;

>

// Обслужить в зоне контроля

Point pR= new Point (region.Locatlon.X,

region.Locatlon.Y);

Rectangle rect= new Rectangle (pR.X, pR.Y, reglon.Width,

region.Height);

if(!disposed)

{

// Вошли в зону контроля

if (rect.Contalns (p) && !inContrl) // Вошли в зону

{

Console.WriteLine ("Вошли в зону");

inContrl= true;

// Захватить разделяемый ресурс

Monitor.Enter (region);

reglon,Work ();

// Освободить разделяемый ресурс

Monitor.Exit (reglon);

>

if (lrect,Contains (p) && inContrl)// Вышли из зоны

{

Console.WriteLine ("Вышли из зоны");

inContrl= false;

}

>

Thread.Sleep (timePeriod);

p,X += dX;

>

>

>

В классе Lorry с функцией Dispose() примера 11.4.3.2 введена специальная

переменная disposed, предотвращающая повторное освобождение ресурса.

При создании объекта грузовика эта переменная принимает значение false,

указывая, что ресурс ещё не освобождался функцией Dispose(). Вызов функ-

ции Dispose() присваивает переменной disposed значение true. Значение true

изменяет функционирование грузовика. Теперь объект типа Lorry, возможно

дождавшись освобождения уже захваченного им ресурса или ещё не захва-

тив ресурс, не будет захватывать ресурс.

Вышеизложенные размышления и введение функции Dispose() привело к

изменению в обработчике кнопки "Del". Изменённая функция обработчика

приведенав примере 11.4.3.3..

Свойство Running объекта типа Lorry позволяет выявить, перемещается ли

грузовик (выполняется ли поток). Для завершения приостановленного пото-

ка, имеющего ложное значение свойства Running объекта, обработчик кноп-

ки "Del" возобновляет поток, вызвав функцию Run(), а затем его завершает,

вызвав функцию Finish(). Разумеется, до вызова функции Finish() вызывается

функция Dispose() для освобождения ресурса.

Пример 11.4.3.3. Удаление объекта класса Lorry с функцией Dispose().

// Обработать нажатие кнопки удаления грузовика с функцией Dlspose()

private void But_Dei (object о, EventArgs e )//

{

if(listBox.SelectedIndex == -1)

{

MessageBox. Show

("Выберете номер удаляемого грузовика в"

+ "\пэлементе списка перед нажатием кнопки");

>

else

{ // Получить выбранный номер из управляющего элемента

int numSei= (int) listBox.SelectedItem;

// Удалить номер из списка номеров грузовиков

listBox.Items.Remove (numSel);

// Найти объект грузовика с номером numSel

IEnumerator inum= aL.GetEnumerator ( );

while (inum.MoveNext ())

{

Lorry lorry= (Lorry) inum.Current;

if (lorry.Number == numSel)

{ // Возобновить поток грузовика