Как реализовать пошаговую кнопку в C #? - PullRequest
3 голосов
/ 24 июня 2010

Я реализовал алгоритм в C #, и я хочу сделать графический интерфейс для него, в моем графическом интерфейсе я хочу поставить кнопку, которая при любом нажатии отображает шаг вперед в алгоритме, поэтому я думаю, что мне нужно поставить что-то вродеПауза?заявления в моем коде, что с любым щелчком он может возобновиться.как мне это сделать?или есть еще какие-то предложения для реализации этой идеи?

Ответы [ 5 ]

15 голосов
/ 24 июня 2010

Похоже, на самом деле вам нужно превратить свой алгоритм в конечный автомат - вместо того, чтобы активно "останавливать" его, вы бы активно "продвигали" его.1005 * блоков итераторов полезно ... если ваш алгоритм в настоящее время в значительной степени использует один метод, вы можете изменить его, вставив оператор yield return в конце каждого логического шага, возвращая некоторое указаниетекущее состояние.

Это не совсем обычное использование блоков итераторов, но это может быть самый простой путь вперед.Ваш пользовательский интерфейс будет вызывать GetEnumerator один раз в начале, а затем MoveNext() каждый раз, когда нажимается кнопка (с последующим доступом к свойству Current, чтобы получить текущее состояние).Не забудьте избавиться от итератора, когда закончите с ним.

2 голосов
/ 24 июня 2010
  1. Запустите ваш алгоритм в потоке, отличном от вашего потока пользовательского интерфейса.
  2. Для синхронизации создайте некоторый дескриптор ожидания, например, AutoResetEvent .
  3. Вы ищете оператор "pause" myWaitHandle.WaitOne() (вызывается вашим потоком алгоритма).
  4. Позвольте алгоритму продолжить выполнение, выполнив myWaitHandle.Set() в вашем потоке пользовательского интерфейса.

Этот метод имеет то преимущество, что ваш пользовательский интерфейс остается отзывчивым, пока выполняется шаг вашего алгоритма.

0 голосов
/ 27 июня 2010

Если это просто «наблюдать» за состоянием алгоритма по мере его развития, почему бы не добавить некоторые события (вероятно, только одно в конце) и позволить обработчику событий хранить массив состояний. Пользовательский интерфейс может просто выполнять итерацию вперед \ назад по мере необходимости.

0 голосов
/ 24 июня 2010

Из вашего описания я думаю, что вам нужен «мастер», который в основном представляет собой приложение с кнопками «предыдущий / следующий».

http://www.differentpla.net/content/2005/02/implementing-wizard-c

Однако, если у вас просто долго выполняемая задача иЕсли вы хотите, чтобы в нем были некоторые перерывы, есть разные способы его решения.

  1. Выполните задачу несколькими способами.

    После завершения метода дождитесь, покапользователь нажал следующее.

  2. Пусть задача выполняется в своем собственном потоке, а в точке, где она должна ждать, дайте потоку спать, пока вы не установите конкретную переменную:

    LongRunningMethod1();
    while(continue1 == true)
    {
        Thread.Sleep(50);
    }
    LongRunningMethod2()
    while(continue2 == true)
    {
        Thread.Sleep(50);
    }
    

Установите для continue1 и 2 значение true в главном потоке, чтобы фоновый поток выполнял свою работу.

0 голосов
/ 24 июня 2010

Вы должны решить, что является «шагом» в вашем алгоритме. Затем вам нужно переписать ваш алгоритм и обернуть его в класс со следующим интерфейсом:

interface ISteppedAlgorithm
{
    bool NextStep(); //returns if the algorithm is finished
    IStepResult LastStepResult {get;}
}

и теперь ваш графический интерфейс будет управлять алгоритмом, подготовленным таким образом. После нажатия кнопки будет вызван метод NextStep (). Если он возвращает false, отключите кнопку (или укажите каким-либо иным способом, что все сделано). Затем прочитайте LastStepResults и обновите display.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...