- •«Технология программирования»
- •Задание
- •Уточнение
- •Разработка программы на 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
4.2 Проблемы возникшие при разработке
Поэтапная разработка программы позволила быстро разработать её и отладить. Проблем не было.
5. Используемая литература
1. Медведев В.И. Особенности объектно-ориентированного программирования на C++/CLI, C# и Java. – Казань: РИЦ «Школа», 2008. – 360 c.: ил. – (Серия «Современная прикладная математика и информатика»).
2. Джесс Либерти. Программирование на C#: 2-е издание. – СПб.: Символ-Плюс, 2003. – 688 c.: ил.
3. Медведев В.И. Программирование на С++, C++.NET и С#: – Казань: Мастер Лайн, 2005. – 270 c.: ил. – (Серия «Современная прикладная математика и информатика»).
Приложение 1. Текст программы на языке c#
Класс Doroga
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 System.Data;
using System.Data.OleDb;
using Car;
namespace Bogoslovskaya
{
public partial class Doroga : 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();
httpChannel = new HttpChannel(55575);
ChannelServices.RegisterChannel(httpChannel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteControl.RemoteObject), "RemoteObject", WellKnownObjectMode.Singleton);
RemoteControl.RemoteObject.addEvent += new RemoteControl.AddDelegate(RemoteObject_addEvent);
RemoteControl.RemoteObject.removeEvent += new RemoteControl.RemoveDelegate(RemoteObject_removeEvent);
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 RemoteObject_removeEvent(string name)
{
foreach (Component component in container.Components)
{
Mashinka mashinka = (Mashinka)component;
if (mashinka.N == System.Convert.ToInt32(name))
{
mashinka.stop();
container.Remove(mashinka);
}
}
}
//обработчик события удаленного объекта "добавить"
void RemoteObject_addEvent(string name)
{
sozdatMashinku();
}
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); // добавление машинки в контейнер
}
//обработчик события выезда машинки из рова
void mashinka_vyehalEvent(int name)
{
try
{
string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source=rov.mdb";
string command = "select datavyesda, n from rov";
OleDbDataAdapter datadapter;
DataSet dataset;
DataTable datatable;
datadapter = new OleDbDataAdapter(command, connectionString);
dataset = new DataSet();
datadapter.Fill(dataset, "rov");
datatable = dataset.Tables[0];
datatable.Rows.Add(new object[] { DateTime.Now, name });
OleDbCommandBuilder cb = new OleDbCommandBuilder(datadapter);
datadapter.InsertCommand = cb.GetInsertCommand();
datadapter.Update(dataset, "rov");
}
catch (Exception exception)
{
MessageBox.Show(exception.ToString(), "Ошибка подключения к БД");
}
}
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);
}
}
}
Класс Car
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) // елси машинка прошла 2 раза по крушгу (0 и 1)
{
v_malom_kruge = false; // переход к большому кругу
chislo_krugov = 0;
}
else
{
chislo_krugov++;
}
tekushaya_tochka = 0; // повторное движение по малому кругу
}
}
}
//освобождаем ресурсы
if(v_rove)
{
resurs_rova.ReleaseMutex();
}
}
}
}
Класс Client
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.Runtime.Remoting;
using RemoteControl;
using System.Data.OleDb;
namespace Client
{
public partial class ClientForm : Form
{
RemoteObjectInerface remoteObjectInerface;
int boatCount;
public ClientForm()
{
InitializeComponent();
remoteObjectInerface = (RemoteObjectInerface)Activator.GetObject(typeof(RemoteObjectInerface), "http://localhost:55575/RemoteObject");
}
//обработчик события нажатия на кнопку "добавить"
private void addButton_Click(object sender, EventArgs e)
{
if (addTextBox.Text != "")
{
remoteObjectInerface.add(addTextBox.Text);
boatCount++;
addTextBox.Text = boatCount.ToString();
}
else
{
MessageBox.Show("Имя не должно быть пустым");
}
}
//обработчик события нажатия на кнопку "удалить"
private void removeButton_Click(object sender, EventArgs e)
{
if (removeTextBox.Text != "")
{
remoteObjectInerface.remove(removeTextBox.Text);
}
else
{
MessageBox.Show("Имя не должно быть пустым");
}
}
//обработчик события нажатия на кнопку "обновить данные"
private void updateDataButton_Click(object sender, EventArgs e)
{
try
{
string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source=rov.mdb";
string command = "select datavyesda, n from rov";
OleDbDataAdapter datadapter;
DataSet dataset;
DataTable datatable;
datadapter = new OleDbDataAdapter(command, connectionString);
dataset = new DataSet();
datadapter.Fill(dataset, "rov");
datatable = dataset.Tables[0];
dataGridView.DataSource = datatable;
}
catch(Exception exception)
{
MessageBox.Show(exception.ToString(), "Ошибка подключения к БД");
}
}
}
}
Класс RemoteControl
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RemoteControl
{
//делегаты удаленного объекта
public delegate void AddDelegate(string name);
public delegate void RemoveDelegate(string name);
public interface RemoteObjectInerface
{
void add(string name);
void remove(string name);
}
//удаленный объект
public class RemoteObject : MarshalByRefObject, RemoteObjectInerface
{
//события удаленного объекта
public static event AddDelegate addEvent;
public static event RemoveDelegate removeEvent;
public void add(string name)
{
if (addEvent != null)
addEvent(name);
}
public void remove(string name)
{
if (removeEvent != null)
removeEvent(name);
}
}
}