Прогрессбар для длительной работы WP7 C # - PullRequest
4 голосов
/ 17 августа 2011

Я пишу приложение для решения судоку.Время расчета решателя в некоторых случаях может превышать 3 секунды, что потребует индикатор выполнения.

, поэтому мой код:

private void solveButton_Click(object sender, RoutedEventArgs e)
{
    progressBar1.Visibility = Visibility.Visible;
    progressBar1.IsIndeterminate = true;
    mySolver.Solve(initialValue)
    progressBar1.Visilibity=Visilibity.collapsed;
    progressBar1.IsIndeterminate = false;
}

Код здесь является сжатой версией моего фактическогокод.Этот код не работает, так как индикатор выполнения не отображается вообще.Мне кажется, что пользовательский интерфейс обновляется только после завершения события.Если после шага решателя я не скрывал индикатор выполнения, индикатор прогресса появляется после решения судоку.Замена решателя на thread.sleep (1000) также приводит к тому же обновлению пользовательского интерфейса.

спасибо за вашу помощь.

Ответы [ 5 ]

4 голосов
/ 17 августа 2011

Вы должны запустить решатель в отдельном потоке. Таким образом, поток пользовательского интерфейса может продолжать работать с объектами пользовательского интерфейса даже во время процесса решения, что позволяет отображать и обновлять индикатор выполнения на экране.

4 голосов
/ 17 августа 2011

Проблема в том, что ваш поток пользовательского интерфейса не становится свободным между тем для отображения индикатора выполнения Вам нужно использовать фоновый рабочий для решения проблемы, и в главном потоке пользовательского интерфейса вы должны отобразить индикатор выполнения

  private void solveButton_Click(object sender, RoutedEventArgs e)
    {
       BackgroundWorker bg = new BackgroundWorker();
       bg.DoWork += new DoWorkEventHandler(DoWork);
       bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
       bg.RunWorkerAsync(); 

       progressBar1.Visibility = Visibility.Visible;
       progressBar1.IsIndeterminate = true;         
    }

void DoWork(Object sender, DoWorkEventArgs args)
{
     mySolver.Solve(initialValue)
}

void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
{

    //  this method will be called once background worker has completed it's task
      progressBar1.Visilibity=Visilibity.collapsed;
      progressBar1.IsIndeterminate = false
}
2 голосов
/ 17 августа 2011

Технически код работает нормально, вы просто написали неверный код.

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

1 голос
/ 17 августа 2011

Я не слишком много знаю о WP7, но с winforms, если у вас есть долго работающая функция, ее нужно запускать в потоке, отличном от пользовательского интерфейса.

Доступно BackgroundWorker доступнотебе на WP7?Вы можете обновить планку события ProgressChanged и изменить жизнеспособность события RunWorkerCompleted

private void solveButton_Click(object sender, RoutedEventArgs e)
{
    progressBar1.Visibility = Visibility.Visible;
    progressBar1.IsIndeterminate = true;

    solveButton.Enabled = false; //I reccomend this so the button can't be pressed twice.

    BackgroundWoker bw = new BackgroundWorker();
    bw.RunWorkerCompleted += bw_RunWorkerCompleted;
    bw.DoWork += bw_DoWork;
    bw.ProgressChanged += bw_ProgressChanged;
    bw.RunWorkerAsync()

}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    mySolver.Solve(initialValue, e)
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if(e.Error != null)
    {
         //Handle any exceptions that happened in the background worker.
    }
    progressBar1.Visilibity=Visilibity.collapsed;
    progressBar1.IsIndeterminate = false;
    solveButton.Enabled = true;
    ((IDisposable)sender).Dispose();
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

//inside mySolver
void Solve(somthing initialValue, DoWorkEventArgs e)
{
    //Your solver work
    e.ReportProgress(progress); //a int from 0-100
    //more solver work
}
.
0 голосов
/ 18 августа 2011

Если вы все еще хотите запустить его в потоке пользовательского интерфейса (что я бы не рекомендовал !!), вы можете использовать индикатор выполнения из набора инструментов WP7, который был выпущен вчера. Он содержит индикатор выполнения, который будет работать, пока ваш поток пользовательского интерфейса заблокирован.

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