Exemple #1
0
        private void onGotoMessage(Message message)
        {
            if (isStarted && this.workers.Contains(message.senderId))
            {
                GoToContainerMessage gtMessage = (GoToContainerMessage)message;

                //foreach (int agentId in gtMessage.infectionSourceAgentIds)
                //{
                //    this.infectOtherAgent(agentId);
                //}

                lock (this.addAgentMessages)
                {
                    for (int i = 0; i < gtMessage.agents.Length; i++)
                    {
                        this.gotoContainer(gtMessage.agents[i], gtMessage.containerTypes[i]);
                    }
                }

                if (gtMessage.containerToMove != null)
                {
                    moveContainer(gtMessage.containerToMove);
                }

                this.agentCounters[message.senderId] = gtMessage.agentCount;

                if (gtMessage.currentResult != null)
                {
                    lock (this.intermediateResults)
                    {
                        this.intermediateResults[message.senderId] = gtMessage.currentResult;
                    }
                }

                this.waiters[message.senderId].Set();
            }
        }
        public void SendGoto()
        {
            lock (gotoAgents)
            {
                if (gotoAgents.Count != gotoContainers.Count)
                {
                    Trace.TraceWarning("!!! Agent and container count doesn't match");
                }
                //return;

                //if (gotoAgents.Count == 0)
                //    return;

                List <AddAgentMessage> ams = new List <AddAgentMessage>();
                foreach (AbstractPerson a in this.gotoAgents)
                {
                    ams.Add(new AddAgentMessage(
                                this.transportSystem.Id,
                                a.GetType().Name,
                                a.GetId(),
                                a.GetHealthState(),
                                1
                                ));
                }

                GoToContainerMessage msg = new GoToContainerMessage(
                    this.transportSystem.Id,
                    ams.ToArray(),
                    this.gotoContainers.ToArray(),
                    this.infectedAgents.ToArray(),
                    GlobalAgentDescriptorTable.Count
                    );

                if (this.moveContainerMessage != null)
                {
                    msg.containerToMove = this.moveContainerMessage;
                }

                msg.currentResult = this.intermediateResult;

                this.transportSystem.SendMessage(msg);
                foreach (AbstractPerson a in this.gotoAgents)
                {
                    GlobalAgentDescriptorTable.DeleteOneAgent(a);
                }

                if (this.moveContainerMessage != null)
                {
                    foreach (var am in this.moveContainerMessage.agentData)
                    {
                        IAgent a = GlobalAgentDescriptorTable.GetAgentById(am.agentId);
                        if (a != null)
                        {
                            GlobalAgentDescriptorTable.DeleteOneAgent(a);
                        }
                    }
                    Containers.Instance.Remove(this.moveContainerMessage.containerId);
                }

                gotoAgents.Clear();
                gotoContainers.Clear();
                infectedAgents.Clear();
                this.moveContainerMessage = null;
                this.intermediateResult   = null;
            }
        }