
Библиотека 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 ( ));
}
}
}