2013-05-02 1 views
0

Здравствуйте, у меня есть функция, которая требует времени для загрузки. поэтому я планирую поставить индикатор выполнения на моей winform, чтобы пользователь знал, что моя программа все еще работает. однако, я не знаю, как я это разрешу. есть кто-то здесь, кто мог бы помочь мне.Progress bar C# - загрузка как процесс

Вот что я планирую сделать:

private void btnProcess_Click(object sender, EventArgs e) 
     { 
      //function which takes time because it contacts to a server 
     } 

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

*** Я следил за этим учебным пособием http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo, но он не дождался завершения определенной функции или события, как экрана загрузки.

*** Мой прогресс не заканчивается после того, как мое событие buttonclick завершило выполнение всех его функций.

Я создал:

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      for (int i = 0; i <= 100; i++) 
      { 
       myBackgroundWorker.ReportProgress(i); 
       System.Threading.Thread.Sleep(100); 
      } 
     } 

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

private void btnProcess_Click(object sender, EventArgs e) 
      { 
       myBackgroundWorker.RunWorkerAsync(); 
       //function which takes time because it contacts to a server 
      } 

Как бы узнать, когда будет мой ButtonClick событие собирается закончиться? так что мой индикатор прогресса также закончится?

+0

«Как бы знать, когда же будет мое событие ButtonClick закончится? так что мой индикатор прогресса закончится также?" Подключите ** событие RunWorkerCompleted() ** вашего элемента BackgroundWorker(), поскольку оно будет срабатывать при завершении метода DoWork(). Из этого события будет безопасно обновлять элементы управления, такие как кнопки сброса и панели прогресса ... –

ответ

0

Да, вы должны. Это довольно просто.

Сделать фоновый рабочий, выполняющий любую работу btnProcess_Click.

Имейте это доклад о ходе работы:

worker.WorkerReportsProgress = true; 

И теперь вы можете иметь этот доклад о ходе работы спровоцирована событием вы подписались.

worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 

При этом, вы можете создать индикатор, чем может обновлять себя на основе этого worker_ProgressChanged события, вызванного вашим вычислением.

Вы можете найти множество реализаций этого просто по Google. Удачи, Надеюсь это поможет.

+0

Сэр вы можете показать мне пример? Или любые примеры этой проблемы. Потому что я действительно смущен. T_T –

+0

Я сказал просто Google это. Вы посмотрели на какой-либо результат? [Здесь один] (http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo). Что вас смущает? – tnw

0

Это две очень хорошие примеры

http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/

http://www.dreamincode.net/forums/topic/246911-c%23-multi-threading-in-a-gui-environment/

Надежда, что помогает

EDIT:

public partial class Form1 : Form 
{ 
    //-------------------------------------------------------------------------- 
    public Form1() 
    { 
     InitializeComponent(); 

     //Initialize backgroundworker 
     Shown += new EventHandler(Form1_Shown); 
     backgroundWorker1.WorkerReportsProgress = true; 
     backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); 
     backgroundWorker1.ProgressChanged += 
     new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 

     //counter 
     YourObject.Counter = 100; 
    } 

    //-------------------------------------------------------------------------- 
    void btnClick_Clicked(object sender, EventArgs e) 
    { 
     //Trigger the background process 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    //-------------------------------------------------------------------------- 
    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //Your freakishly long process, 
     //which needs to be run in the background 

     //to make it simple, I'll just do a for loop 
     for (int i = 0; i < 100; i++) 
     { 
      //The counter will keep track of your process 
      //In your case, it might not be a for loop 
      //So you will have to decide how to keep track of this counter 
      //My suggestion is to decrease/increase this counter 
      //right after importants action of your process 
      backgroundWorker1.ReportProgress(YourObject.Counter--); 
     } 
    } 

    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     //The counter is updated and displayed with a progress bar 
     YourObject.Counter = e.ProgressPercentage; 
    } 
} 
+0

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

+0

Для этого добавьте счетчик к вашему прогрессу. что-то вроде 'int counter; counter ++ 'вам прогресс. И используйте этот счетчик для подачи на «worker.ProgressChanged + = новый ProgressChangedEventHandler (worker_ProgressChanged);' –

+0

сэр вы можете объяснить это более сэр. Потому что я новичок в этом, и я не могу следовать тому, что вы говорите. Можете ли вы сделать его более дружелюбным? –