- •«Технология программирования»
- •Задание
- •Уточнение
- •Разработка программы на c#
- •Программа с точки зрения пользователя. Интерфейс и инструкция.
- •3.2 Программа с точки зрения программиста
- •3.2.1 Все объекты программы и их взаимосвязь
- •3.2.2 Классы
- •1) Класс Car.
- •3.2.3 Потоки и их синхронизация
- •3.2.4 События и их использование
- •3.2.5 Ресурсы
- •3.2.6 Базы данных
- •3.2.7 Удаленный объект и его интерфейс
- •3.2.8 Сервер
- •3.2.9 Клиент
- •3.3 Диаграмма классов
- •3.4 Поэтапная разработка программы
- •3.4.1 Первый этап
- •3.4.2 Второй этап
- •3.4.3 Третий этап
- •3.5 Проблемы, возникшие при разработке проекта
- •4. Разработка программы на языке Java
- •4.1 Отличие от языка c#
- •4.1.1 События
- •4.1.2 Потоки
- •4.1.3 Другие отличия
- •4.2 Проблемы возникшие при разработке
- •5. Используемая литература
- •Приложение 1. Текст программы на языке c#
- •Приложение 2. Текст программы на языке Java
3.4 Поэтапная разработка программы
3.4.1 Первый этап
На первом этапе было реализовано компонент лодки, рисование всего в окне и синхронизация потоков.
Листинг программы приведён ниже.
Класс Дорога.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Car;
namespace Bogoslovskaya
{
public partial class Doroga : Form // класс дорога, унаследован от класса Form
{
Container container;
Mutex resurs_rova;
Mutex resurs_zapravki;
Rectangle pryamougolnil_azs;
List<Point> tochki_bolchogo_kruga;
List<Point> tochki_malogo_kruga;
Thread potok_peperisovki_okna;
bool live;
public Doroga() // конструктор класса дороги
{
InitializeComponent();
container = new Container();
resurs_rova = new Mutex();
resurs_zapravki = new Mutex();
pryamougolnil_azs = new Rectangle(50, 241, 30, 40);
//подписка на событие нажатия на окно
this.MouseClick += new MouseEventHandler(Doroga_MouseClick);
tochki_bolchogo_kruga = new List<Point>();
tochki_malogo_kruga = new List<Point>();
// создание точек, по которым будут двигаться машины
tochki_bolchogo_kruga.Add(new Point(105, 206));
tochki_bolchogo_kruga.Add(new Point(124, 160));
tochki_bolchogo_kruga.Add(new Point(177, 102));
tochki_bolchogo_kruga.Add(new Point(286, 69));
tochki_bolchogo_kruga.Add(new Point(433, 114));
tochki_bolchogo_kruga.Add(new Point(490, 231));
tochki_bolchogo_kruga.Add(new Point(457, 381));
tochki_bolchogo_kruga.Add(new Point(400, 432));
tochki_bolchogo_kruga.Add(new Point(254, 449));
tochki_bolchogo_kruga.Add(new Point(173, 418));
tochki_bolchogo_kruga.Add(new Point(101, 341));
tochki_bolchogo_kruga.Add(new Point(89, 278));
tochki_malogo_kruga.Add(new Point(168, 251));
tochki_malogo_kruga.Add(new Point(186, 198));
tochki_malogo_kruga.Add(new Point(265, 144));
tochki_malogo_kruga.Add(new Point(323, 137));
tochki_malogo_kruga.Add(new Point(403, 185));
tochki_malogo_kruga.Add(new Point(416, 296));
tochki_malogo_kruga.Add(new Point(367, 372));
tochki_malogo_kruga.Add(new Point(269, 386));
tochki_malogo_kruga.Add(new Point(213, 357));
tochki_malogo_kruga.Add(new Point(175, 299));
//создание потока перерисовки окна
potok_peperisovki_okna = new Thread(new ThreadStart(peperisovat));
live = true;
potok_peperisovki_okna.Start();
this.FormClosed += new FormClosedEventHandler(Doroga_FormClosed);
}
void Doroga_FormClosed(object sender, FormClosedEventArgs e)
{
live = false;
foreach (Component component in container.Components)
{
Mashinka mashinka = (Mashinka)component;
//останавливаем
mashinka.stop();
//удаляем
container.Remove(mashinka);
}
}
// функция потока перерисовки окна
void peperisovat()
{
while (live)
{
this.Invalidate();
potok_peperisovki_okna.Join(20);
}
}
//обработчик клика мышкой по окну
void Doroga_MouseClick(object sender, MouseEventArgs e)
{
sozdatMashinku();
}
private void sozdatMashinku()
{
//созданние машинки
Mashinka mashinka = new Mashinka(container.Components.Count, resurs_rova, resurs_zapravki, pryamougolnil_azs
, tochki_bolchogo_kruga, tochki_malogo_kruga);
mashinka.vyehalEvent += new vyehalDeleagate(mashinka_vyehalEvent);
container.Add(mashinka);
}
//фунция перерисовки окна
protected override void OnPaint(PaintEventArgs e)
{
//рисуем точки большого круга
foreach(Point point in tochki_bolchogo_kruga)
{
e.Graphics.DrawString(tochki_bolchogo_kruga.IndexOf(point).ToString(), new Font("Arial", 8), Brushes.Blue, point);
}
//рисуем точки малого круга
foreach (Point point in tochki_malogo_kruga)
{
e.Graphics.DrawString(tochki_malogo_kruga.IndexOf(point).ToString(), new Font("Arial", 8), Brushes.Red, point);
}
//рисуем машинки
foreach(IComponent comp in container.Components)
{
Mashinka mashinka = (Mashinka)comp;
e.Graphics.FillRectangle(mashinka.Brush, new Rectangle(mashinka.Location, new Size(10, 15)));
e.Graphics.DrawString(mashinka.Fuel.ToString(), new Font("Arial", 8), Brushes.Red, mashinka.Location);
}
//Ресуем заправку
e.Graphics.DrawRectangle(Pens.Gray, pryamougolnil_azs);
}
}
}
Класс машина
//компонент - машинка
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace Car
{
public delegate void vyehalDeleagate(int name);
public class Mashinka : Component
{
Mutex resurs_rova;
Mutex resurs_zapravki;
Rectangle pryamougolnil_azs;
List<Point> tochki_bolchogo_kruga;
List<Point> tochki_malogo_kruga;
Thread potok;
bool live;
int tekushaya_tochka;
Point location;
bool v_rove;
bool v_malom_kruge;
int chislo_krugov;
int n; /
Brush brush;
int speed;
int delta;
int fuel;
//событие выезда машинки из рова
public event vyehalDeleagate vyehalEvent;
public Mashinka(int N, Mutex resursRova, Mutex resursZapravki, Rectangle pryamougolnikAzs, List<Point> tochki_b, List<Point> tochki_m)
{
n = N;
brush = Brushes.RosyBrown;
resurs_rova = resursRova;
resurs_zapravki = resursZapravki;
pryamougolnil_azs = pryamougolnikAzs;
tochki_bolchogo_kruga = tochki_b;
tochki_malogo_kruga = tochki_m;
location = tochki_bolchogo_kruga[1];
v_rove = false;
v_malom_kruge = false;
//создание потока
potok = new Thread(new ThreadStart(potok_dvijeniya));
live = true;
chislo_krugov = 0;
fuel = 1000;
Random random = new Random(DateTime.Now.Millisecond);
speed = random.Next(10, 30);
delta = random.Next(10, 20) % 2 == 0 ? -1 : 1;
tekushaya_tochka = delta > 0 ? 2 : tochki_bolchogo_kruga.Count - 2;
//запуск потока машинки
potok.Start();
}
public Brush Brush
{
get
{
return brush;
}
}
public int N
{
get
{
return n;
}
}
public int Fuel
{
get
{
return fuel;
}
}
public Point Location
{
get
{
return location;
}
}
//фунция остановки машинки
public void stop()
{
live = false;
}
//функция потока машинки
void potok_dvijeniya()
{
while (live)
{
if (fuel > 0)
{
--fuel;
}
else
{
while (pryamougolnil_azs.Location != location)
{
if (location.X < pryamougolnil_azs.Location.X)
{
location.X++;
}
if (location.X > pryamougolnil_azs.Location.X)
{
location.X--;
}
if (location.Y < pryamougolnil_azs.Location.Y)
{
location.Y++;
}
if (location.Y > pryamougolnil_azs.Location.Y)
{
location.Y--;
}
potok.Join(speed);
}
resurs_zapravki.WaitOne();
potok.Join(2000);
fuel = 1000;
resurs_zapravki.ReleaseMutex();
}
if (!v_malom_kruge)
{
if ((tekushaya_tochka < tochki_bolchogo_kruga.Count && delta > 0)
|| (tekushaya_tochka < 0 && delta < 0))
{
//движение к следующей точке
if (location.X < tochki_bolchogo_kruga[tekushaya_tochka].X)
{
location.X++;
}
if (location.X > tochki_bolchogo_kruga[tekushaya_tochka].X)
{
location.X--;
}
if (location.Y < tochki_bolchogo_kruga[tekushaya_tochka].Y)
{
location.Y++;
}
if (location.Y > tochki_bolchogo_kruga[tekushaya_tochka].Y)
{
location.Y--;
}
//елси машинка доехала до рова
if (location == tochki_bolchogo_kruga[5])
{
resurs_rova.WaitOne(); // ожидание своей очереди у ресурса
v_rove = true;
}
if (v_rove)
{
if (location.Y == tochki_bolchogo_kruga[5].Y + 40) {
if (vyehalEvent != null)
{
vyehalEvent(n);
}
resurs_rova.ReleaseMutex();
v_rove = false;
}
}
if (location == tochki_bolchogo_kruga[tekushaya_tochka])
{
tekushaya_tochka += delta;
}
potok.Join(speed);
}
else /
{
tekushaya_tochka = 0;
v_malom_kruge = true;
}
}
else
{
if (tekushaya_tochka < tochki_malogo_kruga.Count)
{
if (location.X < tochki_malogo_kruga[tekushaya_tochka].X)
{
location.X++;
}
if (location.X > tochki_malogo_kruga[tekushaya_tochka].X)
{
location.X--;
}
if (location.Y < tochki_malogo_kruga[tekushaya_tochka].Y)
{
location.Y++;
}
if (location.Y > tochki_malogo_kruga[tekushaya_tochka].Y)
{
location.Y--;
}
if (location == tochki_malogo_kruga[tekushaya_tochka])
{
tekushaya_tochka++;
}
potok.Join(speed);
}
else
{
if (chislo_krugov == 1)
{
v_malom_kruge = false;
chislo_krugov = 0;
}
else
{
chislo_krugov++;
}
tekushaya_tochka = 0;
}
}
}
//освобождаем ресурсы
if(v_rove)
{
resurs_rova.ReleaseMutex();
}
}
}
}