Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по дисциплине «Технология прог....doc
Скачиваний:
8
Добавлен:
27.10.2018
Размер:
1.05 Mб
Скачать

3.4.3 Третий этап

На данном этапе реализован удаленный объект и клиент.

Класс 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);

}

}

}