/// <summary> /// Инициализирует параллельную машину с бесконечными регистрами, устанавливая значения всех регистров равными нулю. /// </summary> public RegisterMachine() { _registers = new InfiniteRegisters(); _manager = null; }
/// <summary> /// Запускает программы с возможностью параллельного выполнения. /// </summary> /// <param name="programms">Программы для ПМБР.</param> public void StartParallel(RegisterProgramCollection programs) { if (programs == null) throw new ArgumentNullException("Коллекция программ не может быть неопределенной"); if (programs.Count == 0) throw new ArgumentException("Коллекция программ не может быть пустой"); if (_manager != null) throw new Exception("ПМБР уже запущена"); _manager = new RegisterThreadManager(_registers, programs); _manager.BreakPoints = _breakPoints; _manager.OnComplete += _manager_OnComplete; _manager.ValueOut += _manager_ValueOut; _manager.ValueIn += _manager_ValueIn; _manager.StepCompleted += _manager_StepCompleted; _manager.BreakPointReached += _manager_BreakPointReached; _manager.RunEntryPoint(programs.GetEntry().Id); }
private void _manager_OnComplete(object sender, RegisterThreadManagerEventArgs e) { _manager.BreakPointReached -= _manager_BreakPointReached; _manager.OnComplete -= _manager_OnComplete; _manager.ValueOut -= _manager_ValueOut; _manager.ValueIn -= _manager_ValueIn; _manager.BreakPointReached -= _manager_BreakPointReached; Stop(); BreakPoints = null; _manager = null; if (OnMachineStopped != null) OnMachineStopped(this, new RegisterMachineStoppedEventArgs(e.RegisterChanged)); }
/// <summary> /// Запускает классическую МБР в режиме пошагового выполнения. /// </summary> /// <param name="ops">Список операций для выполнения.</param> public void StartManual(List<Operation> ops) { if (ops == null) throw new ArgumentNullException("Коллекция операций не может быть неопределенной"); if (ops.Count == 0) throw new ArgumentException("Коллекция операций не может быть пустой"); if (_manager != null) throw new Exception("МБР уже запущена"); RegisterProgram mainProg = new RegisterProgram(ops.Cast<RegisterOperation>().ToList().ToArray(), 0, "classic", true); RegisterProgramCollection programs = new RegisterProgramCollection(); programs.Add(mainProg); _manager = new RegisterThreadManager(_registers, programs); _manager.BreakPoints = _breakPoints; _manager.OnComplete += _manager_OnComplete; _manager.BreakPointReached += _manager_BreakPointReached; _manager.RunEntryPoint(0); }