public void SingleStep() { if (_thread != null && _thread.IsAlive) { if (_currentMode == ModeCategory.SingleStep || _currentMode == ModeCategory.Paused) { _thread.Resume(); } else { _currentMode = ModeCategory.SingleStep; SetButtonsEnable(false, true, true, false, true); IsSortCategoriesEnabled = false; ConsoleContent = "已进入单步模式。"; } return; } //没有数据 if (_currentData == null) { Generate(); } _currentMode = ModeCategory.SingleStep; var stepList = SortStepGenerator.Sort(_sortCategory, _currentData); _thread = new Thread(() => { ExecuteSteps(); }); _thread.Start(); SetButtonsEnable(false, true, true, false, true); IsSortCategoriesEnabled = false; (GetView() as PUWindow).ResizeMode = ResizeMode.CanMinimize; }
/// <summary> /// 执行排序步骤集合。 /// </summary> private void ExecuteSteps() { var counter = 0; foreach (var step in SortStepGenerator.Sort(_sortCategory, _currentData)) { var canvas = ActiveItem; if ((_currentMode == ModeCategory.SingleStep || _currentMode == ModeCategory.Paused) && counter != 1 && step.Category != StepCategory.ChangeIndex) { try { _thread.Suspend(); } catch { } } ConsoleContent = step.Description; switch (step.Category) { //移动指示器 case StepCategory.MoveIndivator: canvas.MoveIndicator(step.From - 1, step.To); canvas.SetHighLight(step.SelectedIndex); break; //交换条并交换索引 case StepCategory.SwapBar: canvas.MoveBar(step.From, step.To); canvas.MoveBar(step.To, step.From); canvas.SwapIndex(step.From, step.To); canvas.SetHighLight(step.SelectedIndex); break; //移动条 case StepCategory.MoveBar: canvas.MoveBar(step.From, step.To, step.Raise); canvas.SetHighLight(step.SelectedIndex); break; //修改索引映射 case StepCategory.ChangeIndex: canvas.ChangeIndex(step.ChangedIndexList); if (step.SkipWaiting) { continue; } break; //创建桶: case StepCategory.CreateBucket: canvas.CreateBucket(step.BucketQuantity, step.BucketVolumes); break; //排序完成 case StepCategory.Completed: SetButtonsEnable(true, false, false, false, true); canvas.ResetIndicatorAndBucket(); canvas.SetHighLight(-2); break; } counter++; if (_currentMode != ModeCategory.SingleStep && _currentMode != ModeCategory.Paused) { Thread.Sleep(ExcuteDuration); } } }
// 生成操作 public void Generate() { if (InputDataString == "" || IsUsingRandomChecked) { //尝试转换为Int var quantity = 0; if (Int32.TryParse(InputQuantityString, out quantity)) { InputDataString = NumbersToString(GetRandomNumbers(quantity)); } else { InputQuantityString = "15"; InputDataString = NumbersToString(GetRandomNumbers(15)); } IsUsingRandomChecked = true; } else { InputDataString = InputDataString.Replace(',', ','); if (InputDataString.Split(',').Length - 1 <= 1) { ConsoleContent = $"可用数据的数量低于最小值2。"; return; } } _currentData = StringToNumbers(InputDataString).ToList(); if (_currentData.Min() == _currentData.Max()) { ConsoleContent = $"无法对多个相同数据执行排序。"; return; } ActiveItem.InitCanvas(_currentData); SetButtonsEnable(); IsSortCategoriesEnabled = true; ConsoleContent = $"生成成功,共获取到{_currentData.Count}个数据。使用{_sortCategory}大约需要{SortStepGenerator.Sort(_sortCategory, _currentData)?.Where(x => x.Category != StepCategory.ChangeIndex).Count() - 1}步。"; }
//用户选择了新算法。 public void SortCategoryCheckedChanged(int id) { _sortCategory = (SortCategory)id; if (_currentData != null) { ConsoleContent = $"生成成功,共获取到{_currentData.Count}个数据。使用{_sortCategory}大约需要{SortStepGenerator.Sort(_sortCategory, _currentData)?.Where(x => x.Category != StepCategory.ChangeIndex).Count() - 1}步。"; } }