public void CancelSearch() { while (IsSearching) { Canceled = true; DriveSearch?.CancelSearch(); BestSearch?.CancelSearch(); WorstSearch?.CancelSearch(); RobotSearchWaiter?.PulseAll(); MoveWaiter?.PulseAll(); TargetWaiter?.PulseAll(); Task.Delay(20).Wait(20); } Canceled = false; }
private void Search() { UpdateLearnLabyrinth(Position); WorstSearch.BeginSearch().Wait(); BestSearch.BeginSearch().Wait(); DriveSearch.BeginSearch().Wait(); int robotSearchIndex = 0; do { if (UpdateLearnLabyrinth(Position)) { WorstSearch.BeginSearch().Wait(); } if (IsRouteBlocked(BestSearch.Route)) { BestSearch.BeginSearch().Wait(); } if (IsRouteBlocked(DriveSearch.Route) || DriveSearch.Route.Length - robotSearchIndex <= 1) { DriveSearch.Start = Position; DriveSearch.Target = GetTarget(); DriveSearch.BeginSearch().Wait(); robotSearchIndex = 0; Direction = GetDirection(true, robotSearchIndex); RobotSearchWaiter?.Wait(); if (Canceled) { break; } } robotSearchIndex++; Position = DriveSearch.Route[robotSearchIndex]; Direction = GetDirection(false, robotSearchIndex); HasChanges = true; MoveWaiter?.Wait(); if (!Canceled && GetTarget().Is(Position)) { toTarget = !toTarget; HasChanges = true; TargetWaiter?.Wait(); } if (Canceled) { break; } }while (WorstSearch.Route.PossibleLength <= 0 || WorstSearch.Route.PossibleLength > BestSearch.Route.PossibleLength); System.Diagnostics.Debug.WriteLine("RobotEndSearch: worstLen: {0}, bestLen: {1}", WorstSearch.Route.PossibleLength, BestSearch.Route.PossibleLength); IsSearching = false; }