public void Notify(bool result) { //Console.WriteLine("[StateControl.Notify] Finalização notificada- state:{0}]", stateId); BranchInterpreter branch; elseResult = elseResult || result; count--; int rid = protocol.Matrix [stateId] [((iterations + 1) * Configuration.BASE) + Configuration.RUNNABLE]; if (count == 0 && !elseResult && rid != Configuration.NOTHING) { //Esse objeto morre. count = iterations + 1; //reinicio a contagem, caso haja uma nova exeucao do estado. //Console.WriteLine("[StateControl.Notify] Criado BranchInterpreter- state:{0} | iteracao(-1):{1}", stateId, iterations); branch = new BranchInterpreter(stateId, iterations + 1, this); ThreadPool.QueueUserWorkItem(branch.Go, null); } }
//Dispara a execução do estado. public void Go() { //artifício para suspender a execução do estado nos casos de reconfiguração. ManualResetEvent resetEvent = protocol.getResetEvent(stateId); if (ConfigurationManager.N) { //Console.WriteLine ("[StateControl.Go] STATE: " + stateId); if (resetEvent != null) { Console.WriteLine("[StateControl.Go] DORMIU: estado " + stateId); WaitHandle.WaitAll(new ManualResetEvent[] { resetEvent }); Console.WriteLine("[StateControl.Go] ACORDOU: estado " + stateId); } } Dictionary <int, int> transitions = protocol.Matrix [stateId]; BranchInterpreter branch; //a última transição será considerada o "else". this.count = (transitions.Count / Configuration.BASE) - 1; this.elseResult = false; if (transitions [Configuration.RUNNABLE] != Configuration.END) { count = (count == 0 ? 1 : count); iterations = count - 1; for (int i = 0; i <= iterations; i++) { branch = new BranchInterpreter(stateId, i, this); ThreadPool.QueueUserWorkItem(branch.Go, null); } } else { //Console.WriteLine("[StateControl.Go] Sinaliza Final!"); protocol.doneEvent.Set(); //StateControl: Execução finalizada! } }