none
Массивы и потоки RRS feed

  • Вопрос

  • Здравствуйте! Мне нужна подсказка. Есть программа, которая сортирует массив с помощью некоторого метода. Она реализована с помощью потоков так, что существует задержка и пользователь видит как меняются местами элементы, но мне хотелось бы сделать это не автоматично, а при последовательном нажатии клавиши, т.е. как-то пошагово и чтобы элементы, кот. меняются подсвечивались цветом. Но реализовать это у меня не получается (((.

    Вот ссылка на программу, а то я незнаю именно какую часть кода нужно менять) Если кому не впадлу - помогите плиз )))

    http://depositfiles.com/files/s9750alpw

    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:26 MSDN Forums Consolidation (От:Visual C#)

Ответы

  • Нужно конкретней писать. К примеру если ты используешь пузырковую сортировку, то определяешь какой-нить объект синхронизации

    AutoResetEvent are = new AutoResetEvent(false);

    Затем перед каждой операцией обмена меняешь цвет элементов на UI и ждешь сигнала события AutoResetEvent

        void BubbleSort(object arrObj)
        {
          int[] arr = arrObj as int[];
          int bound = arr.Length - 1;
          int t = 0;
          int temp;
          isSortingprocess = true;
          do
          {
            t = 0;
            if (bound != 0)
            {
              for (int j = 0; j < bound; j++)
              {
                if (arr[j] > arr[j + 1])
                {
                  //Меняем цвет
                  this.Dispatcher.Invoke(new Action(() =>
                    {
                      ((ArrayItemViewControl)spMain.Children[j]).BackColor = Brushes.Red;
                      ((ArrayItemViewControl)spMain.Children[j + 1]).BackColor = Brushes.Red;
                    }), null);
    
                  //Ждем нажатия клавиши
                  are.WaitOne();
                  temp = arr[j];
                  arr[j] = arr[j + 1];
                  arr[j + 1] = temp;
    
                  //Меняем цвет на исходный, а также обновляем текст на измененных элементах
                  this.Dispatcher.Invoke(new Action(() =>
                  {
                    ((ArrayItemViewControl)spMain.Children[j]).BackColor = Brushes.Green;
                    ((ArrayItemViewControl)spMain.Children[j]).Text = arr[j].ToString();
                    ((ArrayItemViewControl)spMain.Children[j + 1]).BackColor = Brushes.Green;
                    ((ArrayItemViewControl)spMain.Children[j+1]).Text = arr[j+1].ToString();
                  }), null);
                }
                t = j;
              }
            }
            if (t == 0) break;
            else bound = t;
          } while (true);
          isSortingprocess = false;
        }

    ну а в обработчике события KeyDown или PreviewKeyDown сигналишь

        private void mainWnd_PreviewKeyDown(object sender, KeyEventArgs e)
        {
          if (e.Key == Key.N && isSortingprocess == true)
          {
            are.Set();
          }
        }

     

    Я думаю, что общий принцип ясен. Если нужна полная реализация решения - обращайся, выложу. 

    • Помечено в качестве ответа I.Vorontsov 2 июня 2010 г. 9:37

Все ответы

  • Добрый день. Пишите конкретнее, в чем именно возникла проблема, на форуме никто переписывать для Вас программу не будет.
    Для связи [Mail]
  • Нужно конкретней писать. К примеру если ты используешь пузырковую сортировку, то определяешь какой-нить объект синхронизации

    AutoResetEvent are = new AutoResetEvent(false);

    Затем перед каждой операцией обмена меняешь цвет элементов на UI и ждешь сигнала события AutoResetEvent

        void BubbleSort(object arrObj)
        {
          int[] arr = arrObj as int[];
          int bound = arr.Length - 1;
          int t = 0;
          int temp;
          isSortingprocess = true;
          do
          {
            t = 0;
            if (bound != 0)
            {
              for (int j = 0; j < bound; j++)
              {
                if (arr[j] > arr[j + 1])
                {
                  //Меняем цвет
                  this.Dispatcher.Invoke(new Action(() =>
                    {
                      ((ArrayItemViewControl)spMain.Children[j]).BackColor = Brushes.Red;
                      ((ArrayItemViewControl)spMain.Children[j + 1]).BackColor = Brushes.Red;
                    }), null);
    
                  //Ждем нажатия клавиши
                  are.WaitOne();
                  temp = arr[j];
                  arr[j] = arr[j + 1];
                  arr[j + 1] = temp;
    
                  //Меняем цвет на исходный, а также обновляем текст на измененных элементах
                  this.Dispatcher.Invoke(new Action(() =>
                  {
                    ((ArrayItemViewControl)spMain.Children[j]).BackColor = Brushes.Green;
                    ((ArrayItemViewControl)spMain.Children[j]).Text = arr[j].ToString();
                    ((ArrayItemViewControl)spMain.Children[j + 1]).BackColor = Brushes.Green;
                    ((ArrayItemViewControl)spMain.Children[j+1]).Text = arr[j+1].ToString();
                  }), null);
                }
                t = j;
              }
            }
            if (t == 0) break;
            else bound = t;
          } while (true);
          isSortingprocess = false;
        }

    ну а в обработчике события KeyDown или PreviewKeyDown сигналишь

        private void mainWnd_PreviewKeyDown(object sender, KeyEventArgs e)
        {
          if (e.Key == Key.N && isSortingprocess == true)
          {
            are.Set();
          }
        }

     

    Я думаю, что общий принцип ясен. Если нужна полная реализация решения - обращайся, выложу. 

    • Помечено в качестве ответа I.Vorontsov 2 июня 2010 г. 9:37