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

Int number;

Point p;

lnt dX;

bool leftRight;

ContrlRegion region;

bool inContrl;

bool life;

bool run;

Thread thr;

int timePeriod= 100;

Warehouse leftWH;

Warehouse rlghtWH;

bool full;

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

// Координаты объекта грузовика

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

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

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

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

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

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

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

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

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

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

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

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

Warehouse RlghtWH, ContrlRegion Region)

{

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

leftWH= LeftWH; rightWH= RlghtWH; full= false;

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

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

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

run= true; llfe= true;

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

thr.Start ();

>

// Свойство Number

public int Number {get {return number;>>

/p/u bСlвicо йPсoтinвtо PPooiinntt {get {return p ; »

// Свойство LeftRight

public bool LeftRight

{

set {leftRlght= value;>

get {return leftRight;>

>

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

public vold Finish ( ) {llfe= false; thr.Join ();}

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

public void Stop ( )

{

run= false;

>

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

public void Run ( )

{

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

{

run= true;

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

>

>

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

private void Moving ( )

{

while (life)

{

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

{

if (I run)

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

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

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

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

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

{

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

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

else // Пересылка справа налево

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

dX= -dX;

> /'/ ОбЪек! I ру^ОВИКЗа ДОС|ИГ СЛсБа

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

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

{

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

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

else // Пересылка справа налево

{if(rightWH.Get (fuil)) full= true;>// Загрузить груз

dX= -dX;

>

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

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

region.Location.Y);

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

region.Height);

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

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

{

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

inContrl= true;

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

Monitor.Enter (region);

region.Work ();

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

Monitor.Exit (region);

>

if (!rect.Contains (p) && inContrl) // Вышли из зоны

{

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

inContrl= false;

>

Thread.Sleep (timePeriod);

p.X += dX;

>

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

// Java и J# File cjLorry класс Lorry

Importjava.awt.*;

import java.util.*;

import java.awt.event.*;

import cjWarehouse;

import cjContrlRegion;

// Класс Lorry

public class Lorry implements Runnable

{

public int number;

public Point p;

int dX;

public boolean leftRight;

ContrlRegion region;

boolean inContrl;

boolean life;

boolean running;

Thread thr;

int tlmePeriod= 100;

Warehouse leftWH;

Warehouse rightWH;

Rectangle rect;

boolean full;

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

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

Warehouse RightWH, ContrlRegion Region)

{

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

leftWH= LeftWH; rightWH= RightWH; full= false;

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

p.x= leftWH.getLocatlon().x+leftWH.WIDTH + 50; p.y= Y;

rect= new Rectangle (reglon.getLocation().x,

region.getLocation().y, region.getSize().width,

reglon.getSize().height);

running= true; life= true;

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

thr= new Thread (this);

thr.start ( );

>

// Свойство Number

public lntgetNumber ( ) {return number;>

// Свойство Point

public Point getPolnt ( ) {return p;}

// Свойство LeftRight

public boolean getLeftRight ( ){return leftRight;>

public void setLeftRight (boolean LeftRight) {thls.leftRight= LeftRight;}

// Свойство Full

public boolean getFull (){return full;}

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

// Номер грузовика

// Координаты объекта грузовика

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

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

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

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

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

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

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

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

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

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

public void Finish ( ) {llfe= false;>;

public void Stop ( ) // Приостановить поток

{

running= false;

>

synchronized public void Run ( ) // Возобновить поток

<

running= true;

notify();

>

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

public void run ()

{

while (life)

{

try

{

synchronized (this)

{

if(!runnlng)

walt (); // Подождать

>

>

catch(InterruptedException e) { }

// Грузовик достиг справа левый склад

lf(p.x <= leftWH.getLocation().x+leftWH.WIDTH)

{

System.out.println ("the left warehouse");

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

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

else

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

dX= -dX;

}

// Грузовик достиг слева правый склад

if(p.x >= rightWH.getLocation().x)

{

//System.out.println ("the right warehouse");

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

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

else

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

dX= -dX;

}

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

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

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

{

//System.out.println ("enter in the region");

inContrl= true;

synchronized(reglon)

{

region.Work ( );

>

>

if (!rect.contains (p) && inContrl) // Вышли из зоны

{

//System.out.println ("leave the region");

inContrl= false;

>

try

{

Thread.sleep (timePeriod);

>

catch (InterruptedException e){}

p.x += dX;

>

>

>

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

// C++/CLI File ccLorry класс Lorry

#include "stdafx.h"

#using <System.Drawing.dll>

#using <System.Wlndows.Forms.dll>

using namespace System;

using namespace System::Windows::Forms;

using namespace System::Drawing;

using namespace System::Threading;

using namespace System::Collections;

using namespace ccWarehouseDII;

using namespace ccContrlRegionDII;

namespace ccLorryDII

{

// Класс Lorry

public ref class Lorry

{