예제 #1
0
 protected SimEvents Interrupter(SimProcess victim, String value, Double timeout = 0)
 {
     while (true)
     {
         victim.Interrupt(value);
         yield return(Env.Timeout(timeout));
     }
 }
예제 #2
0
        // Expected output:
        // Breakdown Bus at 300
        // Bus repaired at 320
        // Breakdown Bus at 620
        // Bus repaired at 640
        // Breakdown Bus at 940
        // Bus repaired at 960
        // Bus has arrived at 1060
        // Dessert: No more events at time 1260
        public static void Main()
        {
            var env = Sim.Environment();
            var bus = env.Process(OperateBus(env, repairDuration: 20, tripLength: 1000));

            _breakBus = env.Process(BreakBus(env, bus, interval: 300));
            env.Run(until: 4000);
            Console.WriteLine("Dessert: No more events at time {0}", env.Now);
        }
예제 #3
0
        SimEvents Called_NoExitValue(SimProcess caller, IntWrapper w)
        {
            Assert.AreSame(caller, Env.ActiveProcess);
            w.X += 10;
            yield return(Env.Timeout(10));

            Assert.AreSame(caller, Env.ActiveProcess);
            w.X += 20;
            yield return(Env.Timeout(20));

            Assert.AreSame(caller, Env.ActiveProcess);
        }
예제 #4
0
        IEvents Interrupter(SimProcess victim, double delay = 0, object value = null)
        {
            yield return(Env.Timeout(delay));

            if (value != null)
            {
                victim.Interrupt(value);
            }
            else
            {
                victim.Interrupt();
            }
        }
예제 #5
0
        static IEvents BreakBus(SimEnvironment env, SimProcess bus, double interval)
        {
            while (true)
            {
                yield return(env.Timeout(interval));

                if (bus.Succeeded)
                {
                    break;
                }
                bus.Interrupt("Breakdown Bus");
                yield return(env.Suspend());
            }
        }
예제 #6
0
            internal RequestEvent(PreemptiveResource resource, double priority, bool preempt)
                : base(resource.Env, priority)
            {
                _resource = resource;
                _priority = new ReqPriority(priority, Env.Now, preempt, resource._nextVersion++);
                _process  = Env.ActiveProcess;

                if (_resource._requestQueue.Count == 0 && TrySchedule())
                {
                    return;
                }
                _handle = _resource._requestQueue.Add(this, _priority);
                if (preempt && _resource._requestQueue.Min.Value.Equals(this))
                {
                    var toPreempt = _resource._users.Min.Value;
                    if (ReqPriority.Comparer.Compare(toPreempt._priority, _priority) <= 0)
                    {
                        return;
                    }
                    toPreempt.Dispose();
                    toPreempt._process.Interrupt(new PreemptionInfo(_process, toPreempt.Time));
                }
            }
예제 #7
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="env"></param>
 /// <param name="generator"></param>
 internal Call(SimEnvironment env, IEnumerator <SimEvent> generator) : base(env)
 {
     (this as IInternalCall).Steps = generator;
     _process = env.ActiveProcess;
     env.ScheduleEvent(this);
 }
예제 #8
0
 internal Interrupt(SimEnvironment env, SimProcess process, object value) : base(env)
 {
     _process = process;
     _value   = value;
 }
예제 #9
0
 IEvents TargetTester2(SimProcess starter)
 {
     Assert.AreSame(null, Env.ActiveProcess.Target);
     Assert.AreSame(Env.ActiveProcess, starter.Target);
     yield break;
 }
예제 #10
0
 static IEnumerable <SimEvent> Interrupter(SimProcess victim)
 {
     victim.Interrupt("NOW");
     yield break;
 }
예제 #11
0
 public Car(SimEnvironment env)
 {
     _env   = env;
     Action = env.Process(Start());
 }
예제 #12
0
        static IEnumerable <SimEvent> EmergencyBrake(SimEnvironment env, SimProcess train)
        {
            yield return(env.Timeout(BreakTime));

            train.Interrupt("FRENO EMERGENZA");
        }