2013-11-29 2 views
-1

У меня нет подробных сведений об управлении потоками в C#. Я хочу создать индикатор выполнения при запуске метода.Запуск панели выполнения с использованием фонового контроллера в C#

У меня есть две формы:

  1. Form1 является форма, которая показывает, как вы запустите приложение. Он имеет кнопку под названием btnScrape. Когда он нажимается, следует вызвать метод, должна появиться форма с индикатором выполнения. Form1 должен быть отключен для пользователя, пока индикатор выполнения не будет завершен.

  2. ProgressBarForm - у этого есть индикатор выполнения и метка.

Код выглядит следующим образом.

//In Form1.cs I have a button. 
     private void btnScrape_Click(object sender, EventArgs e) 
    { 
      //gather data for folloeing parameters from the form. 
      Controller cntrlr = new Controller(urlFilePath, destinationPath, destinationfilename,cmbDepth.SelectedIndex); 

      cntrlr.Vmain(); // this is the method in controller class. while this is running i want show the progress bar. 
    } 

    // in Contrller class  
    class Controller{ 
      List<string> urlList = null; 
      URLFileReader urlFileReader = null; 
      HTTPWorker httpWorker = null; 
      SourceReader srcreader = null; 
      ReportWriter reportWriter = null; 

      string urlFilePath, destinationPath, destinationFileName; 
      int depth; 

    public Controller(string urlFilePath,string destinationPath,string destinationFileName,int depth) 
    { 
     this.urlFilePath = urlFilePath; 
     this.destinationPath = destinationPath; 
     this.destinationFileName = destinationFileName; 
     this.urlList = new List<string>(); 
     this.urlFileReader = new URLFileReader(); 
     this.httpWorker = new HTTPWorker(this.destinationPath); 
     this.reportWriter = new ReportWriter(this.destinationPath,this.destinationFileName); 
     this.srcreader = new SourceReader(this.reportWriter); 
     this.depth = depth; 

    } 

     //this is the method 
     public void Vmain(){ 

       this.urlFileReader.ReadURL(urlFilePath); 
       this.urlList = urlFileReader.geturlList();   

       string pageSrc; 

       foreach (string requestUrl in urlList) 
       { 
        //do sruff for requestUrl 
        //the progressbar should move as the urlList iterate. 
        //additionally i want the label on the top of progress bar to  display the current "requestUrl" 
        //as the urlList is over i want quit from the progressbar window and come back to Form1. Till the progrss bar is completed Form1 should be disabled for the user. 

       } 

     } 



    } 

Пожалуйста, объясните, что там происходит, и дайте рабочий код, если сможете. Заранее спасибо. Не было никакого идеального ответа, который работал на меня, хотя я потратил на это два дня. Я пробовал с BackgroundWorker и потоками. Но решения не найдено. :(

ответ

1

В основной форме вы можете использовать этот код:

private Progressfrm _loadForm; 
    private void ShowProgress() 
    { 
     ToggleForm(); 
     _loadForm = new Progressfrm(); 
     _loadForm.ShowDialog(); 
     var tcheck = new Thread(CheckLoadedProgress); 
     tcheck.Start(); 
     //do stuff here 
    } 
    private void CheckLoadedProgress() 
    { 
     while (_loadForm.IsAccessible) { } 
     ToggleForm(); 
    } 
    private void ToggleForm() 
    { 
     Invoke(new Action(() => Enabled = !Enabled)); 
    } 
    private void btnScrape_Click(object sender, EventArgs e) 
    { 
     var tform = new Thread(ShowProgress); 
     tform.Start(); 
    } 

Тогда Form Прогресс-появится до тех пор, пока не будет заполнено:

private ProgressBar _progressBar; 
    private void Progressfrm_Shown(object sender, EventArgs e) 
    { 
     _progressBar = new ProgressBar { Size = new Size(100, 20), Location = new Point(10, 10) }; 
     Controls.Add(_progressBar); 
     _progressBar.Show(); 
     Refresh(); 
     LoadProgress(); 
    } 
    private void LoadProgress() 
    { 
     while (_progressBar.Value < 100) 
     { 
      _progressBar.Value++; 
      Thread.Sleep(100); 
     } 
     Close(); 
    } 

В этой форме вы должны добавить Событие Shown и добавьте код, как в моем примере. Надеюсь, это поможет.

+0

спасибо. Конечно, это сработает. Но я хочу что-то другое. Я хочу увеличить индикатор выполнения, пока этот foreach работает в методе Vmain. Может, пожалуйста, скажите мне точное решение. Это поможет вам понять, что происходит. –

+0

Я отредактировал свой ответ. Я изменил только основную форму, возможно, это поможет сейчас. – AstralisSomnium

+1

Жаль, что я возвращаюсь четыре года спустя. Но это действительно помогло мне в то время. –

0

Используйте класс BackgroundWorker для вывода progressBar и statusLabel chang es:

BackgroundWorker bgw; 
private void btnScrape_Click(object sender, EventArgs e) 
{ 
    bgw = new BackgroundWorker(); 
    bgw.WorkerReportsProgress = true; 
    bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); 
    bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged); 
    bgw.RunWorkerAsync(); 
} 

void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 1; i <= 100; i++) 
    { 
    Thread.Sleep(100); 
    bgw.ReportProgress(i); 
    } 
} 

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

Это только пример обновления элементов управления асинхронным способом.

+0

Спасибо. Можете ли вы применить это к моей проблеме. к какой форме я должен добавить фона рабочего? Я не могу определить правильный рабочий процесс при использовании фонового рабочего. Тонкс снова за помощью. –

Смежные вопросы