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

Int partLoad; // Выгружаемая или загружаемая порция

int timePeriod= 100; // Время выгрузки или загрузки груза

public event DelEvFromWarehouse evFromWarehouse; // Ссылка

// на объекг события о переполнении и опустошении склада

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

public Warehouse (bool left, bool full)

{

this.left= left;

if (lfull) allLoad= 0; // Склад пуст

>

|| Поместить груз в склад

public bool Put (bool full)

<

if(((100 - allLoad) < PartLoad))

{

// Недостаточно места в складе для выгрузки грузовика

WarehouseEventArgs wH= new WarehouseEventArgs

(left, true);

evFromWarehouse (this, wH); // Сгенерировать событие

> return false;

// Выгрузить грузовик и увеличить порциями груз склада

partLoad= PartLoad; //Определитьвыгрузку

lf(full)

Change (); II Выгрузить

return true;

}

// Получить груз из склада

public bool Get (bool full)

{

if (((allLoad) < PartLoad))

{

// Недостаточно груза в складе для загрузки грузовика

WarehouseEventArgs wH= new WarehouseEventArgs

(left, false);

evFromWarehouse (this, wH); // Сгенерировать событие

> return false;

// Загрузить грузовик и уменьшить порциями груз склада

partLoad= -PartLoad; // Определить выгрузку

If(!full)

Change ( ); // Выгрузить

return true; >

// Поместить или получить груз порциями и с временной задержкой

protected void Change ()

{

// Выполнить операцию только с одним грузовиком

Monitor.Enter (this); // Начать критическую секцию

allLoad += partLoad;

Thread.Sleep (tlmePerlod);

Invalidate ( );

Monitor.Exit (this); // Завершить критическую секцию

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

protected override void OnPaint (PaintEventArgs e)

{

base.OnPa!nt (e);

e.Graphlcs.FillRectangle (new SolldBrush (Color.Yellow), 0,

100 - allLoad, CllentSize.Wldth, ClientSize.Height);

e.Graphics.DrawString (allLoad.ToStrlng ( ), Font,

new System.Drawlng.SolidBrush (Color.Blue), 5, 10);

>

>

// Компонент ContrlRegion

publicclass ContrlRegion: UserControl

{

public void Work ()

{

Thread,Sleep (2000);

>

>

// Компонент Lorry

public ciass Lorry

{

Int number;

Point p;

lnt dX;

bool leftRight;

ContrlRegion region;

bool inContrl;

Random rand;

bool life;

bool run;

Thread thr;

inttimePeriod= 100;

Warehouse leftWH;

Warehouse rightWH;

bool disposed= false;

bool full=false;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public Lorry (int Number, IntY, int DX, Warehouse LeftWH,

Warehouse RightWH, ContrlRegion Region)

{

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

leftWH= LeftWH; rightWH= RightWH;

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

p,X= leftWH.Location.X+leftWH.Width + 50; p.Y= Y; dX=-DX;

rand= new Random ( );

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

run= true; life= true;

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

thr.Start ( );

>

// Свойство Number

public int 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 run;}}

// Свойство Full

public bool Full

{

get {return full;}

set {full= value;}

>

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

public void Dispose ( )

{

disposed= true;

>

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

public void Finish ( ) {life= false; thr.Join ( );}

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

public void Stop ( )

{

run= false;

}

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

public void Run ()

{

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

{

run= true;

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

>

>

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

private vold Moving ( )

<

while (life)

{

// Console.WriteLine("-");

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

{

if (I run)

Monitor.Wait (thls); // Ожидать разблокировки

>

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

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

if(p.X <= leftWH.Location.X+leftWH.Width)

{

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

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

{if(leftWH.Get (full )&&!full) full=true;} // Загрузить

// груз

else

{if(leftWH.Put (full )&&full) full= false;> // Выгрузить

// груз

dX= -dX;

>

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

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

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

{

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

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

{if(rightWH.Put (full )&&full) full=false;} // Выгрузить

// груз

else

{if(rightWH.Get (full )&&!full) full=true;} // Загру-

// зить груэ

dX= -dX;

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

Point pR= new Point (region.Location.X, region.Locatlon.Y);

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

region.Helght);

if(!dlsposed)

{

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

if (rect.Contains (p) && MnContrl) // Вошли в зону

{

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

InContrl= true;

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

Monltor.Enter (region);

region.Work ( );

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

Monltor.Exlt (region);

>

If (!rect.Contalns (p) &8t inContrl) // Вышли из зоны

{

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

inContrl= false;

>

>

Thread.Sleep (timePeriod);

p.X += dX; >

>

class LorryAndWarhouses: Form

{

Lorry lorry;

Warehouse leftWH;

Warehouse rightWH;

ContrlRegion region;

Thread thread;

// Ссылки на объект грузовика

// Ссылки на объект левого склада

// Ссылки на объект правого склада

// Ссылка на объект зоны контроля

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

bool llfe; // Признак жизни потока перерисовки

Button butRun, butStop; // Ссылки на интерфейсные кнопки

Button butAdd, butDel; // Ссылки на интерфейсные кнопки

ListBox llstBox; // Список номеров грузовиков

int numLorry= 0; // Номер грузовика