Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
events
//Rextester.Program.Main is the entry point for your code. Don't change it. //Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5 using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace Rextester { public delegate void ArrivalEventHandler(Barcaza sender, EventArgs e); public delegate void NotifyEventHandler(object sender, EventArgs e); public class Time{ private static int current_time; private static int total_time; //Todos los elementos se subscriben a TimeEvent para avanzar la simulación. public static void RunTime(){ while( current_time < total_time ){ } } } public class Barcaza { private static int IDcount = 0; int capacity = 3; bool travelling; List<Turista> pasajeros; int id; int position; // position 0 corresponde a estar en el puerto public int ID{ get{ return id;} } public Barcaza(){ this.travelling = false; this.pasajeros = new List<Turista>(); this.id = ++IDcount; this.position = 0; } public void Transportar(int distance){ this.travelling = true; Console.WriteLine("Barcaza " + this.id + " a embarcado rumbo a su destino, con los pasajeros:"); foreach (var p in pasajeros){ Console.WriteLine(p.Nombre +" "+ p.Apellido); } position = distance; } public void SubirPasajero(Turista t){ if( ! this.travelling ) pasajeros.Add(t); } public void Avanzar(){ if(position == 0 && travelling){ //raise arrival event pasajeros.Clear(); OnArrival(EventArgs.Empty); } else{ position--; } } //Eventos: //Llega barcaza: notifica a la agencia que llegó la barcaza. Esta es un evento de la instancia Barcanza. //De esta forma se puede extender el modelo a que varios barcos estén funcionando //Agencia debe subscribirse a tal evento // public event ArrivalEventHandler Arrival; public void OnArrival(EventArgs e){ if( Arrival != null){ Arrival(this, e); } } } public class Turista{ public string Nombre{ get; set; } public string Apellido{ get; set; } public bool on_board; public Turista(string nombre, string apellido){ this.Nombre = nombre; this.Apellido = apellido; this.on_board = false; } public bool Embarcar(){ return true; } } public class Agencia{ Queue<Turista> lista_espera; public int Size{ get{ return lista_espera.Count; } } public Agencia(){ this.lista_espera = new Queue<Turista>(); } //Registrar Turista public void RegistrarTurista(Turista t){ lista_espera.Enqueue(t); } //Subscribirse a los eventos de las Barcazas public void RegistrarBarcaza(Barcaza b){ b.Arrival += new ArrivalEventHandler(NotifyArrival); } //Eventos public event NotifyEventHandler Notify; //Este método se llama cuando Barco llega public void NotifyArrival(Barcaza sender, EventArgs e){ Console.WriteLine("Notificación! Barcaza " + sender.ID + " ha llegado y está lista para salir"); for(int i = 0; i < 3; i++){ if( lista_espera.Count > 0 ){ Turista pasajero = lista_espera.Dequeue(); sender.SubirPasajero(pasajero); } } sender.Transportar(1000); } } public class Program { public static void Main(string[] args) { //Your code goes here //Simulación //Parámetros de simulación int nbarcazas = 1; int time = 0; int pcount = 0; Random rand = new Random(); Agencia agencia = new Agencia(); Barcaza single_boat = new Barcaza(); agencia.RegistrarBarcaza(single_boat); //Simulación MultiThread //1 thread: llegada de clientes //2 thread: barcos //Sección crítica: embarcar pasajeros a los barcos. //Inicializar threads while (time < 10000){ //cada iteración la probabilidad que llegue un Console.WriteLine("------"); if(rand.NextDouble() < 0.1 ){ agencia.RegistrarTurista(new Turista( "John" , (++pcount).ToString() )); } //Barco avanza single_boat.Avanzar(); time++; } Console.Read(); } } }
run
|
edit
|
history
|
help
0
Full text search using Linqdb
dfdfdff
Delegate In C#
test
Test
CodeAdvent
hello...
Cs
salary
ConcurrentStack<T>