- •4.1. Объектное представление программы 6
- •4.3. Потоки 7
- •5.Поэтапная разработка программной системы 7
- •1. Задание
- •2.Уточнение задания
- •3. Описание разрабатываемой программы с точки зрения пользователя
- •4.2. События
- •4.3. Потоки
- •5.Поэтапная разработка программной системы
- •5.3.1. Этап 1. Разработка класса Avto
- •5.3.2. Этап 2. Разработка события ev и уведомления
- •5.3.3. Этап 3. Разработка прикладного и дочернего окон, кнопки добавления шаров.
- •5.3.4. Этап 4. Добавление элемента списка, добавление кнопок остановки и удаления.
- •5.3.5. Этап 5. Добавления события ev.
- •11. Приложение 4. Текст программы на языке Java
4.2. События
В программе имеются несколько событий. Объект автомобиля генерирует событие evSpecial. Данное событие используется при перерисовке шаров в прикладном окне. На эти события всех обычных объектов должен быть подписан один обработчик HandlerEvSpecial или update(), инициирующий перерисовку окна.
Кроме этого события и уведомления объект автомобиля генерирует другое событие ev или уведомление при каждом изменении значения координат. На это событие или уведомление должен быть подписан обработчик Handlerev.
Также в программе используется предопределённые события, генерируемые при нажатии кнопок, и событие, генерируемое при выборе номера автомобиля из интерфейсного элемента списка.
4.3. Потоки
В программе применяются кроме основного потока, реализуемого функцией Main() или main(), ещё рабочие потоки. Каждый из n+1 объектов машин (кругов) располагает собственным потоком с потоковой функцией.
5.Поэтапная разработка программной системы
Разработка приложения будет осуществляться поэтапно. Вначале разработаем класс Avto потокового объекта и протестируем его. Затем создадим и отладим класс Autos потоковых объектов, который управляет автомобилями. Для просмотра результатов тестирования мы воспользуемся консолью.
В дальнейшем мы наследуем класс Autos из базового класса Form или Frame и будем отображать шары в области клиента прикладного окна (в форме) в виде кругов одного цвета. Нам придётся модифицировать класс Avto потокового объекта, добавив в него координаты и их приращения. Для обеспечения перерисовки шаров мы воспользуемся событием или уведомлением, которое будет генерироваться после каждого изменения их координат.
Убедившись в совместном функционировании шаров и их отображении в области клиента прикладного окна, мы перейдём к разработке дочернего окна, на котором разместим управляющие элементы – 3 кнопки и список автомобилей.
При реализации Autos –приложения мы одновременно будем использовать консоль и окна. Отладочная информация на консоли отразит полезную информацию о внутреннем функционировании приложения. Отладив Autos–приложение, следует отменить выдачу на консоль.
На последнем этапе мы добавим событие столкновения и разъезда автомобилей и свяжем события и уведомления объектов класса Avto с этим обработчиком.
Для большей наглядности при создании приложений мы воспользуемся диаграммами классов языка UML.
В программе обычные объекты объединим в одномерном массиве длиной n. Длина массива зависит от количества добавленных автомобилей, что регулируется пользователем.
5.3.1. Этап 1. Разработка класса Avto
На первом этапе создадим основной класс Avto потокового объекта, который включает самые необходимые данные:
num – номер обычного объекта,
life – признак жизни потока (life= true - поток выполняется, life= false
поток завершён),
run – признак выполнения потока (run= true - поток выполняется,
run= false - поток приостановлен),
thread – поток класса Thread.
Включим в класс Avto функции:
Avto ( ) – конструктор класса,
~Finish ( ) – деструктор класса,
AvtoFunc ( ) – запустить обычный объект,
Suspend ( ) – приостановить выполнение обычного объекта,
Resume ( ) – возобновить выполнение обычного объекта.
Диаграмма класса Avto представлена на рис. 5.3.1.1.
Рис. 5.3.1.1. Диаграмма классов Avto–приложения первого этапа разработки
В примере 5.3.1.1 приведена реализация первого этапа на языке C#.
В примере 5.3.1.2 приведена реализация первого этапа на языке C++/CLI.
В примере 5.3.1.3 приведена реализация первого этапа на языке Java.
Пример 5.3.1.1. Реализация Avtos–приложения первого этапа
на языке C#.
using System;
using System.Threading;
using System.Collections;
public class Avto
{
public int n;
public int x, y;//координаты машины
public double fi = 0.1;
public int dx1, dy1;//приращения машин
Thread thread;
public bool life;//признак жизни потока
public bool run = true;
public Avto(int N, int X, int Y)
{
n = N;
x = X; y = Y;
life = true;
//создать и запустить поток
thread = new Thread(new ThreadStart(AvtoFunc));
thread.Start();
}
public void Finish()//завершить поток
{
//Resume();
life = false;
}
void AvtoFunc()
{
while (life)
{
if (run)
{
Thread.Sleep(50);
//уравнение движения по окр-ти
dx1 = (int)(19 * Math.Sin(fi));
dy1 = (int)(19 * Math.Cos(fi));
x += dx1;
y += dy1;
Console.WriteLine("x= " +x);
Console.WriteLine("y= " +y);
fi += 0.1;
}
}
}
public void Suspend()//приостановить поток
{
if (run)
{
run = false;
}
}
public void Resume()//возобновить поток
{
if (!run)
{
run = true;
}
}
}
class Avtos1
{
static void Main()
{
Avto a = new Avto(1, 50, 50);
}
}
/*
Р
езультат:
*/
Пример 5.3.1.2. Реализация Balls–приложения первого этапа
на языке C++/CLI.
#include "stdafx.h"
using namespace System::Threading;
using namespace System;
ref class Avto
{
public:
int n;
int x, y;//координаты машины
double fi;
int dx1, dy1;//приращения машин
Thread ^thread;
bool life;//признак жизни потока
bool run;
Avto(int N, int X, int Y)
{
run = true;
fi=0.1;
n = N;
x = X; y = Y;
life = true;
//создать и запустить поток
thread = gcnew Thread(gcnew ThreadStart(this,&Avto::AvtoFunc));
thread->Start();
}
void Finish()//завершить поток
{
//Resume();
life = false;
}
void AvtoFunc()
{
while (life)
{
if (run)
{
Thread::Sleep(50);
//уравнение движения по окр-ти
dx1 = (int)(19 * System::Math::Sin(fi));
dy1 = (int)(19 * System::Math::Cos(fi));
x += dx1;
y += dy1;
System::Console::WriteLine("x= " +x);
System::Console::WriteLine("y= " +y);
fi += 0.1;
}
}
}
void Suspend()//приостановить поток
{
if (run)
{
run = false;
}
}
void Resume()//возобновить поток
{
if (!run)
{
run = true;
}
}
};
static void main()
{
Avto ^a = gcnew Avto(1, 50, 50);
}
/*
Р
езультат:
*/
Пример 5.3.1.3. Реализация Avtos–приложения первого этапа
на языке Java.
package Avtos1;
////////////////////
//C# File Avtos1
class Avto implements Runnable // Класс обычного объекта
{
public int num;
public int x, y;
public double fi = 0.1;
public int dx1, dy1;
Thread thr;
public boolean run = true;
boolean life;
public Avto(int Num, int X, int Y) // Конструктор
{
num = Num;
x = X; y = Y;
life = true;
thr = new Thread(this);
thr.start();
}
//---------------
synchronized public void Suspend() // Приостановить
{
if (run)
{
run = false;
}
}
//---------------
synchronized public void Resume() // Возобновить
{
if (!run)
{
run = true;
notify();
}
}
//---------------
public void run()
{
while (life)
{
if (run)
{
try
{
Thread.sleep(50);
}
catch (InterruptedException e) { }
x += dx1;
y += dy1;
dx1 = (int)(19 * Math.sin(fi));
dy1 = (int)(19 * Math.cos(fi));
System.out.println("x=" +x);
System.out.println("y=" + y);
fi += 0.1;
}
}
}
}
//-------------------------------------
class Avtos // Класс объектов
{
};
class Avtos1
{
public static void main()
{
new Avto(1,50,50); // Создать объекты класса Balls
}
}
Результат:
*/
