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

It); // Подписать обработчик

private void But (Object obj, EventArgs а) r \

string st= tB.Text;

try

{

int n=System.Convert.ToInt32 (st);

if(n<0) tB.Text= "negative";

else tB.Text= "positive";

}

//catch (Exception e)

catch (FormatException e)

{

tB.Text= tB.Text + " Error! Enter the correct number";

>

static void Main ( ) // Главная функция

{

CTextBox cT= new CTextBox ( );

Application.Run (cT);

>

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

// C+ + /CLI

#include "stdafx.h"

#using <System.Drawing.dll>

#using <System.Windows.Forms.dll>

using namespace System;

using namespace System::Windows::Forms;

using namespace System::Drawing;

ref class CTextBox : Form // Класс прикладного окна

{

TextBox ^tB; // Редактор

Button ^b; // Кнопка

public:

CTextBox( ) // Конструктор

{

Text="TestNumber"; // Установить заголовок прикладного окна

tB= gcnew TextBox ( ); // Создать редактор

tB->Location= *gcnew Point (10, 30); // Разместить

tB->Size= *gcnew Drawing::Size (250, 20); // Установить размер

tB->Text= "Enter the number"; // Установить текст в редакторе

thls->Controls->Add (tB); // Добавить редактор в форму

b= gcnew Button (); // Создать кнопку

b->Text= "OK"; // Установить название кнопки

b->Location= *gcnew Drawing::Point (10, 50); // Разместить кнопку

b->Size= *gcnew Drawing::Size (40, 30); // Установить размер

Controls->Add (b); // Добавить кнопку в форму

// Подписать обработчик

b->Click += gcnew EventHandler (this, &CTextBox::But);

>

private:

void But (Object ^obj, EventArgs ла)

i

String ^st= tB->Text;

try

{

int n=System::Convert::ToInt32 (st);

if(n<0) tB->Text= "negative";

else tB->Text= "positive";

>

//catch (Exception e)

catch (FormatException ле)

<

tB->Text= tB->Text + " Error! Enter the correct number";

>

>

>;

Void main ( )

{

Application::Run (gcnew CTextBox ( )); // Выполнить

>

C# и C++/CLI. Обработчик But() кнопки извлекает строку из редактора тек-

ста, применив свойство Text редактора. В блоке try-catch осуществляется

преобразование извлечённой строки в целое число с помощью статической

функции ToInt32() класса Convert. Если символы преобразуемой строки не

являются цифрами, то во время преобразования будет выброшено исключе-

ние типа FormatException и в текстовом редакторе появится строка Error! Enter

the correct number. Иначе положительное число в поле редактора заменит-

ся на слово positive, а отрицательное на negative.

Java и J#. На событие кнопки с помощью функции addActionListener() под-

писан объект анонимного класса ActionListener адаптера с обработчиком actionPerformed().

Обработчик в блоке try-catch извлекает из объекта tB редак-

тора строку, используя статическую функцию parseInt() класса Integer и свой-

ство getText() редактора. Результат работы программы совпадает с результа-

том работы программы на языке C#.

Обратите внимание, что в теле конструктора CTextBox( ) на языке Java аргу-

мент функции setLayout (nuII) установки менеджера расстановки равен null,

поэтому размещение редактора и кнопки в окне осуществляется не менедже-

ром, а программистом с помощью свойств setLocation(), setSize() и sctText().

Рис. 10.10.4. Прикладное окно приложения примера 10.10.4 после ввода по-

ложительного числа и нажатия на кнопку

П.Разработка программы LorryEndWarehouse

Разработаем программу, в прикладном окне которой размещены два склада с

грузом, который перевозится грузовиками. Склады представлены прямо-

угольниками, часть которых закрашена желтым цветом, указывающим за-

полненность склада. Грузовики, представленные в виде полых или заполнен-

ных кругов с номерами, горизонтально перемещаются от склада к складу, за-

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

ным прямоугольником. Прикладное окно программы csLorryAndWarehouse

изображено нарис. 11.4.3.1.

Среди объектов есть объекты с потоками, использующими разделяемые

объекты (разделяемые ресурсы). Например, ресурс "склад с товарами" (warehouse)

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

ми (lorry), которые друг за другом разгружают в него груз или загружаются

грузом. Каждый объект грузовика перемещается с помощью потока. Когда

несколько грузовиков подъезжают к складу, то только одному из них дозво-

лено загрузиться или выгрузиться на складе, то есть только один поток из по-

токов грузовиков должен завладеть объектом склада, а другие должны встать

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

нительно к разделяемому ресурсу необходимо синхронизировать параллель-

но выполняющиеся потоки, использующие его. Что и будет сделано в про-

грамме. В программе кроме разделяемого ресурса-склада применен другой

ресурс - зона контроля (control region), при въезде в которую грузовики бу-

дут обслуживаться по очереди. Это второй разделяемый ресурс.

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

выполнять над их объектами одну и ту же операцию, то применяется список

- объект класса ArrayList. По мере создания объекты грузовиков включаются

в этот список. При необходимости элементы списка (объекты грузовиков)

циклически извлекаются, и с каждым из них выполняется требуемая опера-

ция.

Для фиксации полного заполнения или полного опустошения складов

применим событие или уведомление. На это событие (уведомление) среаги-

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

дами, сообщив об этом каждому грузовику.

Классы склада, зоны контроля и грузовика разместим в отдельных биб-

лиотеках. О создании библиотек в средах Visual Studio .NET и Eclipse расска-

зано в приложении 3 книги в конце книги. В приложениях 1 и 2 приведены

версии этой программы без библиотек, включающие все классы в одном при-

ложении.