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

If(llorry.Running)lorry.Run ( );

lorry.Dispose ( );

lorry.Finish();

aL.Remove (lorry);

listBox.Items.Remove (lorry.Number);

return;

>

}

>

}

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

private vold ThrPaint ()

{

while (life)

{

// Console.WriteLine ("+++");

Invalidate ( );

Thread.Sleep (150);

>

>

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

public void Finish ( )

{

life= false; thread.Join ( );

>

// Обработать кнопку закрытия окна

protected override void OnClosed (EventArgs e)

{

base.OnClosed (e);

IEnumerator lnum= aL.GetEnumerator ();

while (inum.MoveNext ( ))

{

Lorry lorry= (Lorry) inum,Current;

lorry.Finlsh ();

lorry= null;

}

Finish ( );

}

// Перерисовать область клиента прикладного окна

protected override void OnPaint (PaintEventArgs e)

{

base.OnPaint (e);

IEnumerator inum= aL.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry lorry= (Lorry) inum.Current;

e.Graphics.DrawEllipse (new Pen(Color.Blue, 2),

lorry.Point.X - 10, lorry.Point.Y - 10, 20, 20);

if(lorry.Full)e.Graphics.FillElllpse (new

SolldBrush(Color.Blue), lorry.Point.X - 10,

lorry.Polnt.Y - 10, 20, 20);

e.Graphics.DrawString (lorry.Number.ToString ( ),

Font, new SolidBrush (Color.Blue),

lorry.Point.X + 10,

lorry.Point.Y + 10);

if(leftRight)

e.Graphics.FIIIRectangle (new

SolidBrush(Color.Red),240,110,100,10);

else e.Graphics.FIIIRectangle (new

SolidBrush(Color,Green),240,110,100,10)

>

// обработать событие склада

public void EvFromWarehouseHandler (object sender,

WarehouseEventArgs args)

{

WarehouseEventArgs wH= (WarehouseEventArgs) args;

if((lwH.Left && wH.Full)||(wH.Left && wH.Full))

{

lock(this)

{

leftRight= !leftRight;

// Console.WriteLine("leftRight= " + leftRight);

IEnumerator inum= aL.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry lorry= (Lorry) inum.Current;

lorry.LeftRight= leftRight;

>

Invalidate();

>

// Основная функция

static void Main ()

{

Application.Run (new LorryAndWarhouses ( ));

Приложение 2. cjLorryAndWarehouse- приложение

на языке Java(J#)

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

П JdVd

// Приложение с компонентами Lorry, Warehouse, ConrlRegion

// и с управляющими элементами

//

importjava.awt.*;

importJava.util.*;

import java.awt.event.*;

// Класс данных события

public class WarehouseEventArgs

{

private boolean left; // Признак идентификации склада

private boolean full; // Признак заполнения склада

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

public WarehouseEventArgs (boolean left, boolean full)

{

this.left= left; thls.full= full;

>

// Свойство заполнения склада

public boolean getFull ( ) {return full;>

// Свойство идентификации склада

public boolean getLeft ( ) {return left;}

>

class beWatched extends Observable // Класс наблюдаемого объекта

{

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

public beWatched ( ) { }

void notlfyObs (WarehouseEventArgs arg)

{ setChanged ( ); notifyObservers (arg);}

>

// Класс склада

public class Warehouse extends Panel

{

boolean left; // Признак идентификации склада

lnt allLoad; // Текущий размер груза в складе

lnt PartLoad= 10; // Размер груза грузовика

int partLoad; // Получаемая или помещаемая порция груза

int tlmePeriod= 100; // Время получения или помещения груза

public beWatched bW; // Ссылка на вспомогательный наблюдаемый

// объект

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

publicWarehouse (boolean left, boolean full)

{

allLoad= 100;

this.left= left;

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

bW= new beWatched (); // Наблюдаемый объект склада

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

synchronized public boolean Put (boolean full )

{

if (!full) return false;

if (allLoad >= 100) return false;

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

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

change ( );

return true; >

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

synchronized public boolean Get (boolean full )

{

if (full) return false;

if (((allLoad) < PartLoad))

{

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

WarehouseEventArgs wA= new WarehouseEventArgs

(left, false);

bW.notifyObs (wA); // Уведомить обозревателя

return false;

}

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

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

change ();

return true;

// Поместить или получить груз

public void change ()

{

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

synchronized (this) // Критическая секция

>

allLoad += partLoad;

try

{

Thread.sleep (timePeriod);

>

catch (InterruptedExceptlon e) { >

repaint ( );

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

public void paint (Graphics g)

{

g.setColor (Color.yellow);

g.drawRect (0, 0, this.getSize().width, this.getSize().height);

g.fillRect (0, this.getSize().height - allLoad, thls.getSize().wldth,

this.getSize().height);

g.setColor (Color.black);

g.drawString (Integer.toString (allLoad), 5, 30);

>

// Класс ContrlRegion

public class ContrlRegion extends Panel

{

// Проконтролировать грузовик

public vold Work ()

{

try

{

Thread.sleep (1000);

>

catch (InterruptedException e){}

>

// Класс Lorry

public class Lorry implements Runnable

{

public int number; // Номер грузовика

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

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

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

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

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

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

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

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

lnt timePerlod= 100;

Warehouse leftWH;

Warehouse rlghtWH;

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

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

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

Rectangle rect;

boolean full;

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

public Lorry (lnt Number, lntY, lnt 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,getLocation().x+leftWH.WIDTH + 50; p.y= Y;

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

region.getLocatlon().y, reg!on.getSize().wldth,

reglon.getSize().height);

running= true; life= true;

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

thr= newThread (this);

thr.start (); >

// Свойство Number

public int getNumber () {return number;>

// Свойство Point

public Point getPoint ( ) {return p;}

// Свойство LeftRight

public boolean getLeftRight ( )<return leftRight;}

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

/p/u Сblвicо йbсoтoвlоe aFnu lgl etFull (){return full;} // Завершить поток

public vold Finish () {life= false;};

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

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

{

running= true;

notify();

{

running= false;

}

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

public void run ( )

{

while (life)

{

try

<

synchronized (this)

{

if(!runnina)

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

>

>

catch(InterruptedException e) { >

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

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

{

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

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

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

else

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

dX= -dX;

>

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

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

{

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

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

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

else

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

dX= -dX;

>

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

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

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

{

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

inContrl= true;

synchronized(region)

{

region.Work ();

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

{

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

InContrl= false; >

try

{

Thread,sleep (timePeriod);

>

catcn (Interruptedtxception e){}

p.x += dX;

class LorryAndWarehouses extends Frame implements Runnable, Observer

{

Lorry lorry;

Warehouse leftWH;

Warehouse rlghtWH;

ContrlRegion region;

Button butRun, butStop;

Button butAdd, butDel;

Choice choice;

Thread thread;

boolean llfe;

lnt numLorry= 0;

boolean leftRight;

int Y= 20;

Random rand;

ArrayList aL;

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

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

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

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

// Ссылки на интерфейсные кнопки

// Ссылки на интерфейсные кнопки

// Ссылка на элемент списока

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

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

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

// Признак направления перемещения грузовиков

|f Координата Y пути грузовика

// Ссылка на случайное число

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

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

LorryAndWarehouses ( )

{

this.setTitle ("Test"); // Установить заголовок окна

this.setSize (350, 180); // Установить размер окна

this.setLayout (null); // Установить отсутствие менеджера расстановки

this.setBackground (Color.lightGray);

aL= new ArrayList ( ); // Создать объект списка грузовиков

rand= new Random ( ); // Создать случайное число

leftRight= true; // Установить направление "слева направо"

// Создать кнопки

// Создать кнопку "Add" добавления шара

butAdd= new Button ("Add"); // Создать объект кнопки

butAdd.setLocation (240,85); // Разместить в окне

butAdd.setSize (65, 20); // Установить размер кнопки

butAdd.setBackground (Color.lightGray);

thls.add (butAdd); // Добавить кнопку в коллекцию окна

// Подписать обработчик на событие кнопки ""Add"

butAdd.addActionListener (new ActionListener ()

{

public void actionPerformed (ActlonEvent aE)

{

numLorry++;

Y += 20;

lnt dX = rand.nextInt (5) + 5;

if (leftRight) dX= dX;

else dX= -dX;

// Создать объект грузовика

lorry= new Lorry (numLorry, Y, dX, leftWH, rightWH,

reglon);

aL.add (lorry); // Включить объект в список грузовиков

// Добавить номер грузовика в элемент списка номеров

cholce.addItem (Integer.toString(numLorry));

>

»;

// Создать кнопку "Del" удаления

butDel= new Button ("Del"); // Создать объект кнопки

butDel.setLocation (240,115); // Разместить в окне

butDel.setSize (65, 20); // Установить размер кнопки

butDel.setBackground (Color.lightGray);

this.add (butDel); // Добавить кнопку в коллекцию окна

// Подписать обработчик на событие кнопки "Del"

butDel.addActionListener (new ActionListener ()

{

public void actionPerformed (ActionEvent aE)

{

// Если есть элементы в списке, то удалить грузовик с

// наименьшим номером или выбранным номером из

// списка

if(cholce.getItemCou nt() I=0)

{

String s= choice.getSelectedItem();

int num= Integer.parseInt(s);

for (lnt i= 0; i<aL.size(); I++)

{

Lorry lorry= (Lorry) aL.get(i);

if (lorry.number == num)

{

lorry.Finish ( );

aL.remove (I);

choice.remove(s);

return;

>

>

> »;

// Создать кнопку "Run" пуска

butRun= new Button ("Run"); // Создать объект кнопки

butRun.setLocatlon (240,25); // Разместить в окне

butRun.setSize (45, 20); // Установить размер кнопки

butRun.setBackground (Color.llghtGray);

44%t<. unj.Q дuИuЯ ^ fkw<uiu^\Duimiij,V ,,/ /^ nu^ufui^unn,,i^b, л„Н,.у^чпл./,. . un ^.«,л|н«_|„&.Р,| Цти„ икпа.

// Подписать обработчик на событие кнопки "Run"

butRun.addActlonLlstener (new ActionListener ()

{

public vold actionPerformed (Act!onEvent aE)

{

for (int 1= 0; i<aL.size(); i++)

{

Lorry lorry= (Lorry) aL.get(i);

lorry.Run ( );

>

>

»;

// Создать кнопку "Stop" останова

butStop= new Button ("Stop"); // Создать объект кнопки

butStop.setLocatlon (240,55); // Разместить в окне

butStop.setSize (45, 20); // Установить размер кнопки

butStop.setBackground (Color.lightGray);

thls.add (butStop); // Добавить кнопку в коллекцию окна

// Подписать обработчик на событие кнопки "Stop"

butStop.addActionListener (new ActionListener ( ) {

public void actionPerformed (ActionEvent aE)

{

for(inti= 0; l<aL.size(); i++)

{

Lorry lorry= (Lorry) aL.get(i);

lorry.Stop ( );

}

>

»;

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

choice= new Choice ( ); // Создать объект элемента списка

cholce.setLocation (240, 145); // Разместить в окне

cholce.setSize (60, 20); // Установить размер элемента

thls.add (choice); // Добавить элемент в коллекцию окна

// Создать склады

// Создать объект leftWH левого склада

leftWH= new Warehouse (true, true); // Создать объект склада

leftWH.setLocation (10, 10); // Разместить в окне

leftWH.setSlze (30, 100); // Установить размер склада

leftWH.setBackground (Color.whlte);

leftWH.bW.addObserver(thls);

thls.add (leftWH); // Добавить склад в коллекцию окна

leftWH.show ();

// Создать объект rightWH правого склада

rightWH= new Warehouse (false, false); // Создать объект склада

rlghtWH.setLocation (200, 10); // Разместить в окне

rightWH.setSlze (30, 100); // Установить размер склада

rightWH.setBackground (Color.whlte);

rig htWH. bW. addObserver(this);

thls.add (rlghtWH); // Добавить склад в коллекцию окна

rightWH.show ( );

// Создать область region контроля

reglon= new ContrlRegion (); // Создать объект области контроля

region.setLocatlon (100, 0); // Разместить в окне

region.setSlze (30, 200); // Установить размер области

region.setBackground (Color.green);

this.add (region); //Добавить область в коллекцию окна

// Создать поток thread перерисовки и запустить его

llfe= true;

thread= new Thread (this,"controlThread");

thread.start();

>

// Потоковая функция run перерисовки

public void run ( )

{

while (life)

{

repaint (); // Перерисовать окно

try

{

Thread.sleep (150);

>

catch (InterruptedExceptlon e){>

>

>

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

public vold Finish ( )

{

life= false;

// Завершить все потоки при закрытии прикладного окна

public boolean handleEvent (Event e)

{

if(e.ld == Event.WINDOW_DESTROV)

{

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

for (lnt 1= 0; l<aL.size(); I++)

{

Lorry lorry= (Lorry) aL.get(i);

lorry.Flnish ( ):

>

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

Finish ();

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

System.exlt(0); >

return (super.handleEvent(e));

>

И Перерисовать область клиента прикладного окна

public void paint (Graphics g)

{

// Нарисовать каждый грузовик с номером

for (int i= 0; l<aL.size(); I++)

{

Lorry lorry= (Lorry) aL.get(l);

g.setColor (Color.blue);

g.drawOval (lorry.p.x - 10, lorry.p.y - 10, 20, 20);

lf(lorry.getFull())

g.fillOval (lorry.p.x - 10, lorry.p.y - 10, 20, 20);

lf(lorry.getLeftRight()) g.setColor(Color.red);

else g.setColor(Color.green);

g.drawString (Integer.toString(lorry.number), lorry.p.x + 10,

lorry.p.y + 10); >

>

// обработать уведомление склада

public void update (Observable obs, Object args)

{

WarehouseEventArgs arg=(WarehouseEventArgs) args;

// Изменить направление перемещения грузовиков

if(arg.getLeft() && larg.getFull())

leftRight= false;

if (!arg.getLeft() && !arg.getFull())

leftRight= true;

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

for (int i= 0; i<aL.size(); i++)

{

Lorry lorry= (Lorry) aL.get(i);

lorry.setLeftRlght (leftRight);

>

// Выдать информацию о направлении перемещения и

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

//Console.Write("eventevFromWarehouse leftRight=" +

// leftRight);

if (arg.getLeft())

System.out.print("OcnaA leftWH ");

else

System.out.prlnt(" Склад rightWH ");

if (arg.getFull())

System.out.println(" полный");

else

System.out.println(" пустой");

>

// Выполнить основной поток приложения

public static void main ()

{

LorryAndWarehouses laWH= new LorryAndWarehouses ( );

laWH.show ();

>

Приложение 6. Использование сред разработ-

ки программ

Использование Visual Studio .NET

Рассматривается последовательность действий в среде Visual Studio

для создания консольных и Windows-приложент.

Консольное С++/СЫ-приложение

Для создания и выполнения консольного С++/СХ/-приложения после

запуска Visual Studio выполнить действия: