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

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

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

lorry.Dispose ( );

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

lorry.Finish();

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

aL.Remove (lorry);

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

listBox.Items.Remove (lorry.Number);

return; >

>

>

>

В приложениях 1 и 2 книги приведены варианты разработанных про-

грамм на языках C# и J# (Java), содержащие все классы в одном соответст-

вующем приложении.

12. Зачетные задачи

Приведённые в данном разделе задачи позволят не только самостоятель-

но проверить уровень усвоения изложенного в книге материала, но также

способствует попрактиковаться в разработке простых программ, в которых

акцентировано внимание на наиболее трудно усвояемых языковых средствах

языков C# и Java, связанных с событиями, уведомлениями и потоками. Для

каждого задания приводится вариант результативной программы на языках

C# и Java. Для облегчения разработки программ, каждое задание снабжено

примечанием, которое может быть учтено только при возникновении трудно-

стей. Игнорирование примечания способствует проявлению творчества;, соз-

данию своих версий программ, которые можно будет сравнить с приведён-

ными версиями.

12.1. Задание 1

Программа содержит два объекта, представленных окнами и связанных

друг с другом с помощью событий (уведомлений). Каждое окно содержит

редактор текста. Прикладное окно содержит поток, обеспечивающий посред-

ством событий (уведомлений) обмен содержимого редакторов текста через

1000 мс.

Примечание: Поток прикладного окна циклически через 1000 мс посыпает событие (уве-

домление) другому окну, передав ему текст из своего редактора. Обработчик другого окна прини-

мает этот текст и помещает его в свой редактор и отправляет событие (уведомление) прикладному

окну с текстом своего редактора. Теперь обработчик прикладного окна, приняв этот текст, при-

сваивает его редактору этого прикладного окна.

// Java Обмен текста между редакторами разных окон

Importjava.Awt.*;

Import Java.Awt.Event.*;

Importjava.Util.*;

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

class Obs extends Observable

<

public void performObs (String s)

{

setChanged ( );

notifyObservers (s); //или (new String(s));

}

class First extends Frame implements Observer

{

private TextField tBf; // Ссылка на объект редактора текста

public Obs obs; // Ссылка на наблюдаемый объект

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

public First ( )

<

obs= new Obs ( ); // Создать наблюдаемый объект

this.setTitle ("First");

setSize (140, 130);

this.setVisible (true);

this.setLayout (null);

this.setBackground (Color,lightGray);

// Создать редактор текста

tBf= new TextField ( );

tBf.setText ("first");

tBf.setLocation (10, 50);

tBf.setSize (100, 30);

this.add (tBf);

>

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

public void update (Observable ob, Object obj)

{

// Запомнить текст редактора данного окна

String st=tBf.getText ();

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

String s=( (String)obj) .toString();

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

tBf.setText (s);

//Передать текст редактора данного окна в другое окно

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

obs.performObs (st);

>

>

// Класс прикладного окна

class Second extends Frame implements Observer, Runnable

{

public Obs obs; // Ссылка на наблюдаемый объект

private TextField tBs; // Ссылка на объект редактора текста

private Thread t;

private boolean life;

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

public Second ( )

{

this.setTitle ("Second");

setSize (240, 130);

obs= new Obs ( ); // Создать наблюдаемый объект

this.setLayout (null);

this.setBackground (Color.lightGray);

this.setVlsible (true);

// Создать редактор текста

tBs= new TextField ();

tBs.setLocation (10, 50);

tBs.setText ("second");

tBs.setSlze (100, 30);

thls.add (tBs);

// Примененить внутренний анонимный класс для закрытия окна

this,auuvVindowLlsiener (new VVindowAdapier ()

{

public vold wlndowCloslng (WindowEvent wE)

{

life= false;

try

{

t.join ();

>

catch (InterruptedExceptlon e) { >

System.exit (0); >

»;

// Создать и запустить поток

life= true;

t= new Thread (this);

t.start ();

>

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

public void update(Observable obs, Object obj)

{

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

String s= ((String)obj).toString();

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

tBs.setText (s);

>

public void run ( )

{

while(llfe)

{

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

String s= tBs.getText ( );

// Передать извлечённый текст в другое окно

obs.performObs (s); // или (new String(s));

try

{

Thread.sleep (1000);

>

catch(InterruptedExceptlon e) { >

dass Exchange

<

// Выполнить основной поток

static public void main ()

<

Second s= new Second (

First f= new First ();

s.obs.addObserver (f);

f.obs.addObserver (s);

>

}

); // Создать объект прикладного окна

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

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

// уведомление скна наблюдателя s

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

// уведомление окна наблюдателя f

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

// C# Обмен текста между редакторами разных окон

using System;

using System.Drawing;

using System.Threading;

using System.Windows.Forms;

delegate void Del (string s); // Делегат события

<cla ss First: Form

TextBox tBf;

public event Del ev; // Ссылка на событие

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

public First ( )

{

thls.Text="First";

this.Vlslble=true;

Slze= newSlze (140, 130);

tBf= new TextBox ();

tBf.Text="first";

tBf.Locatlon= new Point (10, 50);

tBf.Size= new Size (100, 30);

this.Controls.Add (tBf);

>

// Обработчик события

public void Hand (string s)

{

// Запомнить текст из редактора текста данного окна

string st=tBf.Text;

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

// в редактор данного окна

tBf.Text= s;

// Послать запомненный текст в редактор другого окна

if (ev != null) ev (st);

// Класс прикладного окна

class Second : Form

{

public event Del ev; // Ссылка на событие

TextBox tBs;

Thread t;

bool life;

// /!\ fi \~u nbl. p^Klup

public Second ( )

{

this.Text="Second";

Size= new Size (240, 130);

tBs= new TextBox ( );

tBs.Text="second";

tBs.Location= new Point (10, 50);

tBs.Size= new Size (100, 30);

this.Controls.Add (tBs);

// Создать и стартовать поток

life= true;

t= new Thread (new ThreadStart(Run));

t.Start ( );

>

private vold Run ( )

{

while(life)

{

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

string s= tBs.Text;

// Передать ссылку на этот текст другому окну

if (ev 1= null) this.ev (s);

Thread.Sleep (1000);

>

>

// Обработчик события

public void Hand (string s)

<

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

// в редактор данного окна

tBs.Text= s;

>

protected override void OnClosed(EventArgs e)

{

life= false;

tJoin ();

class Exchange

{

// Выполнить основной поток

static void Main ( )

{

Second s= new Second ();

First f= new First();

s.ev+= new Del (f.Hand);

f.ev+= new Del (s.Hand);

Application.Run (s);

>

>