Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОП-Примеры / Приложение 1.doc
Скачиваний:
15
Добавлен:
12.03.2015
Размер:
220.67 Кб
Скачать

Библиотека csLorryAndWarehouseChangedRemoting.Dll на языке с#

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

// C# Удалённый объект RemObj

using System;

using System.ComponentModel;

using System.Collections;

namespace csLorryAndWarehouseChangedRemotingDll

{

// Класс объекта данных события evToCont

public class RemObjEventArgs: EventArgs

{

private string method;

private int number;

public RemObjEventArgs (string S, int N)

{method= S; number= N;}

public RemObjEventArgs (string S)

{method= S;}

public string Method

{

get {return method;}

}

public int Number

{

get {return number;}

}

}

// Делегат события evToCont

public delegate void FromRemObjToCont (RemObjEventArgs args,

ref ArrayList aL);

// Интерфейс IRemObj удалённого объекта

public interface IRemObj

{

void AddLorry ( );

void RemoveLorry (int carrNumber);

void RemoveAllLorries ( );

ArrayList GetNumLorries ( );

void RunLorries ( );

void StopLorries ( );

void ShowComponents ( );

}

// Класс RemObj удалённого объекта

public class RemObj: MarshalByRefObject, IRemObj

{

public event FromRemObjToCont evToCont;

ArrayList aL= null;

public RemObj ( )

{

}

// Обработать нажатие кнопки пуска

public void RunLorries ( )

{

if (evToCont != null)

{

RemObjEventArgs a= new RemObjEventArgs

("RunLorries");

evToCont (a, ref aL);

}

}

// Обработать нажатие кнопки останова

public void StopLorries ( )

{

if (evToCont != null)

{

RemObjEventArgs a= new RemObjEventArgs

("StopLorries");

evToCont (a, ref aL);

}

}

// Обработать нажатие кнопки добавления грузовика

public void AddLorry ( )

{

if (evToCont != null)

{

RemObjEventArgs a= new RemObjEventArgs

("AddLorry");

evToCont (a, ref aL);

}

}

// Обработать нажатие кнопки удаления грузовика

public void RemoveLorry (int numSel)

{

if (evToCont != null)

{

RemObjEventArgs a= new RemObjEventArgs

("RemoveLorry", numSel);

evToCont (a, ref aL);

}

}

// Удалить все грузовики

public void RemoveAllLorries ( )

{

if (evToCont != null)

{

RemObjEventArgs a= new RemObjEventArgs

("RemoveAllLorries");

evToCont (a,ref aL);

}

}

// Получить номера грузовиков

public ArrayList GetNumLorries ( )

{

ArrayList aL= null;

if (evToCont != null)

{

RemObjEventArgs a= new RemObjEventArgs

("GetNumLorries");

evToCont (a, ref aL);

}

return aL;

}

// Показать номера компонентов

public void ShowComponents ( )

{

if (evToCont != null)

{

RemObjEventArgs a= new RemObjEventArgs

("ShowComponents");

evToCont (a,ref aL);

}

}

}

}

Сервер csServerChangedRemoting.Cpp на языке с#

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

// C# Сервер

using System;

using System.ComponentModel;

using System.Collections;

using System.Drawing;

using System.Threading;

using System.Windows.Forms;

using ccLorryDll;

using ccWarehouseDll;

using ccContrlRegionDll;

using csLorryAndWarehouseChangedRemotingDll;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Http;

namespace csLorryAndWarehouseServer

{

// Контейнер грузовиков

class LorryContainer: Container

{

Warehouse leftWH; // Ссылки на объект левого склада

Warehouse rightWH; // Ссылки на объект правого склада

ContrlRegion region; // Ссылка на объект зоны контроля

bool leftRight; // Признак направления перемещения

// грузовиков

int numCarr= 0; // Номер грузовика

int Y; // Координата Y пути грузовика

Random rand; // Ссылка на случайное число

// Конструктор

public LorryContainer (Warehouse leftWH, Warehouse rightWH,

ContrlRegion region)

{

this.leftWH= leftWH; this.rightWH= rightWH;

this.region= region;

Y= 20; rand= new Random ( );

leftRight= true;

leftWH.evFromWarehouse += new DelEvFromWarehouse

(this.EvFromWarehouseHandler);

rightWH.evFromWarehouse += new DelEvFromWarehouse

(this.EvFromWarehouseHandler);

}

// Обработать событие от объекта класса RemObj

public void RemObjHandler (RemObjEventArgs args, ref ArrayList aL)

{

switch (args.Method)

{

case "AddLorry": AddLorry ( );

break;

case "RemoveLorry": RemoveLorry (args.Number);

break;

case "GetNumLorries": aL=GetNumLorries ( );

break;

case "NumLorries": NumLorries (ref aL);

break;

case "RunLorries": RunLorries ( );

break;

case "StopLorries": StopLorries ( );

break;

case "RemoveAllLorries": RemoveAllLorries ( );

break;

case "ShowComponents": ShowComponents ( );

break;

}

}

// Добавить грузовик

public void AddLorry ( )

{

numCarr++;

Y += 20;

int dX = rand.Next (5, 10);

if (leftRight) dX= dX;

else dX= -dX;

Lorry lorry= new Lorry (numCarr, Y, dX, leftWH, rightWH,

region);

base.Add (lorry);

lorry.Start ( );

}

// Удалить грузовик

public void RemoveLorry (int lorryNumber)

{

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

if (comp.Number == lorryNumber)

{

comp.Finish ( );

base.Remove (comp);

return;

}

}

}

// Получить список номеров грузовиков

public ArrayList GetNumLorries ( )

{

ArrayList arList= new ArrayList ( );

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

arList.Add (comp.Number);

}

return arList;

}

// Получить иначе список номеров грузовиков

public void NumLorries (ref ArrayList aL)

{

ArrayList arList= new ArrayList ( );

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

arList.Add (comp.Number);

}

aL= arList;

}

// Возобновить движение грузовиков

public void RunLorries ( )

{

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

comp.Run ( );

}

}

// Приостановить движение грузовиков

public void StopLorries ( )

{

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

comp.Stop ( );

}

}

// Удалить все грузовики

public void RemoveAllLorries ( )

{

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

comp.Finish ( );

base.Remove (comp);

}

}

// Выдать номера грузовиков на консоль

public void ShowComponents ( )

{

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

Console.WriteLine ("компонент номер " +

comp.Number.ToString ( ));

}

}

// Обработать событие склада

public void EvFromWarehouseHandler (object sender,

WarehouseEventArgs args)

{

leftRight= !leftRight;

IEnumerator inum= this.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

comp.LeftRight= leftRight;

}

}

}

class LorryAndWarhouses: Form

{

Warehouse leftWH; // Ссылки на объект левого склада

Warehouse rightWH; // Ссылки на объект правого склада

ContrlRegion region; // Ссылка на объект зоны контроля

Thread thread; // Ссылка но объект потока перерисовки

bool life; // Признок жизни потока перерисовки

LorryContainer lorryCont;// Ссылка на контейнер компонентов-

// грузовиков

// Конструктор

public LorryAndWarhouses ( )

{

this.Text= "Server";

this.ClientSize= new Size (350, 130);

// Создать склады

// Создать объект левого склада

leftWH= new Warehouse(true, true);

leftWH.Location= new Point (10, 10);

leftWH.Size= new Size (30, 100);

leftWH.BackColor= Color.White;

this.Controls.Add (leftWH);

leftWH.Show ( );

// Создать объект правого склада

rightWH= new Warehouse (false, false);

rightWH.Location= new Point (200, 10);

rightWH.Size= new Size (30, 100);

rightWH.BackColor= Color.White;

this.Controls.Add (rightWH);

rightWH.Show ( );

// Создать область контроля

region= new ContrlRegion ( );

region.Location= new Point (100, 0);

region.Size= new Size (40, ClientSize.Height);

region.BackColor= Color.LightSkyBlue;

this.Controls.Add (region);

region.Show ( );

// Создать контейнер компонентов

lorryCont= new LorryContainer (leftWH, rightWH, region);

// Создать удалённый объект типа RemObj

RemObj remObj;

remObj= new RemObj ( );

remObj.evToCont+= new FromRemObjToCont

(lorryCont.RemObjHandler);

// Создать поток перерисовки и запустить его

life= true;

thread= new Thread(new ThreadStart (ThrPaint));

thread.Start ( );

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

// Создать и зарегистрировать канал

HttpChannel httpChannel;

try

{

httpChannel= new HttpChannel (8080);

ChannelServices.RegisterChannel (httpChannel);

}

catch(Exception e)

{

Console.WriteLine (e.Message);

return;

}

// Маршализовать удалённый объект компонента

RemotingServices.Marshal (remObj, "RemoteObject"); }

// Потоковая функция перерисовки

private void ThrPaint ( )

{

while (life)

{

Invalidate ( );

Thread.Sleep (150);

}

}

// Завершить поток перерисовки

public void Finish()

{

life= false; thread.Join ( );

}

// Обработать кнопку закрытия окна

protected override void OnClosed (EventArgs e)

{

base.OnClosed (e);

lorryCont.RemoveAllLorries ( );

Finish ( );

}

// Перерисовать область клиента прикладного окна

protected override void OnPaint (PaintEventArgs e)

{

base.OnPaint (e);

IEnumerator inum= lorryCont.Components.GetEnumerator ( );

while (inum.MoveNext ( ))

{

Lorry comp= (Lorry) inum.Current;

e.Graphics.DrawEllipse (new Pen (Color.Blue, 2),

comp.Point.X - 10, comp.Point.Y - 10, 20, 20);

e.Graphics.DrawString (comp.Number.ToString ( ), Font,

new SolidBrush (Color.Blue), comp.Point.X + 10,

comp.Point.Y + 10);

}

}

// Основная функция

static void Main ( )

{

// Создать прикладное окно сервера

Application.Run (new LorryAndWarhouses ( ));

}

}

}

Соседние файлы в папке КОП-Примеры