Algorytmy sortowania z wizualuzacją

0

Pomyślałem że fajnie by było napisać program który by oprócz sortowania pokazywał co robi przez podświetlanie porównywanych elementów, krótko myślałem szybko usiadłem do pisania
napisałem buble sort no fajnie działa pomyślałem to teraz to podświetlanie i tu zonk bo to co myślałem że będzie łatwe poprzez zmianę koloru tła textblocka nie działa, kod daję poniżej

namespace SortingAlgorithmVisualisation
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private TextBlock[] Number;
        private string To_Swap;
       
        public MainWindow()
        {
            InitializeComponent();
            Number = new TextBlock[8];
            Number[0] = First;
            Number[1] = Second;
            Number[2] = Third;
            Number[3] = Fourth;
            Number[4] = Fifth;
            Number[5] = Sixth;
            Number[6] = Seventh;
            Number[7] = Eighth;

            To_Swap = String.Empty;
        }

      
        private void Visualisation(object sender, RoutedEventArgs e)
        {
            
            //buble sort
            for (int i = 0; i < Number.Length; i++)
            {
                for (int k = 0; k < Number.Length - 1; k++)
                {
                    Number[k].Background = Brushes.Red;
                    Number[k + 1].Background = Brushes.Blue;
                    System.Threading.Thread.Sleep(300);
                    if (Convert.ToInt32(Number[k].Text) > Convert.ToInt32(Number[k + 1].Text))
                    {
                        To_Swap = Number[k].Text;
                        Number[k].Text = Number[k + 1].Text;
                        Number[k + 1].Text = To_Swap;
                        To_Swap = String.Empty;
                    }
                    System.Threading.Thread.Sleep(300);
                    Number[k].Background = Brushes.White;
                    Number[k + 1].Background = Brushes.White;
                }
            }

            
        }
    }
}

I teraz pytanie właściwe jak uzyskać taki efekt podświetlania? I dlaczego jak mam w kodzie System.Threading.Thred.Sleep(); to program nie działa poprawnie? w sensie zrobi jedną zmianę tyle

1

UI jest jednowątkowy, a ty blokujesz ten jedyny wątek, zamiast zwracać go najszybciej jak się da. Inaczej mówiąc: UI nie jest w stanie się odświeżyć, bo mu na to nie pozwalasz. Rozwiązania są dwa:

  • eleganckie i poprawne to użycie osobnego wątku do przeprowadzania obliczeń i wysyłanie serii krótkich zdarzeń (jedno zdarzenie to np jednoczesna zmiana koloru kilku elementów) do pętli zdarzeń wątku obsługującego UI
  • brzydkie obejście czyli wykonanie Application.DoEvents() jak w https://stackoverflow.com/questions/2341731/why-wont-control-update-refresh-mid-process ma to swoje wady, ale nie będę się rozpisywał, bo nie znam .NETa, a drążyć tematu mi się też nie chce :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1