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

Int number;

Point ^p;

int dX;

bool leftRight;

ContrlRegion ^region;

bool inContrl;

bool life;

bool run;

Thread ^thr;

Int timePeriod;

Warehouse ^leftWH;

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

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

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

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

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

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

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

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

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

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

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

Warehouse ^rightWH; // Ссылка на правый склад

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

public:

Lorry (int Number, lnt Y, int DX, Warehouse ^LeftWH,

Warehouse ^RightWH, ContrlRegion ^Reglon)

{

number= Number; dX= DX; leftRlght= true;

leftWH= LeftWH; rightWH= RightWH; timePerlod= 100;

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

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

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

run= true; llfe= true;

thr= gcnew Thread (gcnewThreadStart (this, &Lorry::Moving));

thr->Start ( );

>

// Свойство Number

property lnt Number { lnt get() {return number;»

/p/r oСpвeоrйtyс тPвoоl nPto^i nPt {Polnt^ get() {return p ; »

// Свойство LeftRight

property bool LeftRight

{

void set (bool value) {leftRlght= value;>

bool get () {return leftRight;}

>

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

vold DelResource ( )

{

disposed= true;

>

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

void Rnish ( ) {life= false; thr->3oin ();}

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

void Stop ( )

{

run= false;

}

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

void Run ( )

{

run= true;

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

}

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

private:

vold Moving ()

{

while (life)

i

if (I run)

Monitor::Walt (this); // Ожидать разблокировки

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

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

lf((p->X) <= (leftWH->Location.x+leftWH->Width)j

{

Console::WrlteLine ("Левая граница");

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

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

else

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

dX= -dX;

>;

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

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

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

{

Console::WrlteLine ("Правая граница");

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

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

else

rightWH->Get ( ); // Загрузить груз

dX= -dX;

>

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

Point ^pR= gcnew Point (region->Location.X,

region->Location.Y);

Rectangle ^rect= gcnew Rectangle (pR->X, pR->Y,

reglon->Width, region->Height);

if(!disposed)

{

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

if (rect~>Contains (*p) && !inContrl)

{

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

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

inContrl= true;

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

Monitor::Enter (region);

region->Work (); // Контролируемся

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

Monltor::Exit (region);

>

if (!rect->Contains (жр) && inContrl)

{

// Вышли из зоны

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

inContrl= false;

>

>

Thread::Sleep (tlmePeriod);

p->X += dX;

>;

Проверить функционирование компонента Lorry позволит приложение

csTestLorry, приведённое в примере 12.4.2.3. К приложению надо подсоеди-

нить библиотеки csLorry, csWarehouse и csContrlRegion, содержащие компо-

ненты Lorry, Warehouse и ContrlRegion.

Пример 12.4.2.3. Приложение csTestLorry.

///////////////

/ / C# File csTestLorry

using System;

using System.Threadlng;

using System.Drawing;

using System.ComponentModel;

using System.Wlndows.Forms;

using csWarehouseDII;

using csContrlRegionDII;

using csLorryDII;

class TestLorry: Form

{

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

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

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

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

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

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

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

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

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

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