2012-03-06 4 views
1

У меня есть ListBox, в который я помещал некоторые файлы, если файл не является AVI, я автоматически конвертирую его, но я хочу, когда файлы, конвертирующие сообщение, будут записывать на этикетке, что файлы теперь преобразуются в другой формат, i знаю, что мне нужно использовать Диспетчер, чтобы обновить поток пользовательского интерфейса, но теперь я использую Winform вместо WPF, и мне нужна помощь в этом. BTW я не могу использовать задачу, потому что я использую .NET 3.5Обновление ui thread

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    System.IO.Stream myStream; 
    OpenFileDialog thisDialog = new OpenFileDialog(); 
    thisDialog.InitialDirectory = "c:\\"; 
    thisDialog.Filter = "All files (*.*)|*.*"; 
    thisDialog.FilterIndex = 1; 
    thisDialog.RestoreDirectory = false; 
    thisDialog.Multiselect = true; // Allow the user to select multiple files 
    thisDialog.Title = "Please Select Source File"; 
    thisDialog.FileName = lastPath; 
    List<string> list = new List<string>(); 

    if (thisDialog.ShowDialog() == DialogResult.OK) 
    { 
     foreach (String file in thisDialog.FileNames) 
     { 
      try 
      { 
       if ((myStream = thisDialog.OpenFile()) != null) 
       { 
        using (myStream) 
        { 
         listBoxFiles.Items.Add(file); 
         lastPath = file; 
        } 
       } 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
      } 
     } 

     for (int i = 0; i < listBoxFiles.Items.Count; i++) 
     { 
      string path = (string)listBoxFiles.Items[i]; 
      FileInfo fileInfo = new FileInfo(path); 

      if (fileInfo.Extension != ".AVI") 
      { 
       listToRemove.Add(path); 
      } 
     } 

     (new System.Threading.Thread(sendFilesToConvertToPcap)).Start(); 

     foreach (string file in listToRemove) //remove all non .AVI files from listbox 
     { 
      listBoxFiles.Items.Remove(file); 
     } 
    } 
} 

эту функцию необходимо изменить метку:

 public void sendFilesToConvertToPcap() 
     { 
      if (listToRemove.Count == 0) // nothing to do 
      { 
       return; 
      } 

lblStatus2.Content = "Convert file to .AVI..."; 

      foreach (String file in listToRemove) 
      { 
       FileInfo fileInfo = new FileInfo(file); 
       myClass = new (class who convert the files)(fileInfo); 
       String newFileName = myClass.mNewFileName; 
       listBoxFiles.Items.Add(myClass._newFileName); 
      } 

lblStatus2.Content = "Finished..."; 

     } 
+0

Таким образом, вы хотите запустить длительный процесс (например, преобразование в фоновом режиме) и обновить метку с ходом процесса преобразования? – bloudraak

+1

Используйте компонент «BackgroundWorker». –

+0

Трудно сказать, в чем вопрос. Длинный образец кода. Локализованный. Закрыть! – usr

ответ

0
public void sendFilesToConvertToPcap() 
{ 
    ..... 
    .... 
    this.Invoke((MethodInvoker)delegate { 
    lblStatus2.Text = "Convert file to .AVI..."; }); 

.... 
} 
+0

благодаря помощи – user979033

2

Ваш вопрос, кажется, что вы хотите конвертировать несколько файлов , Возможно, вам захочется рассмотреть класс BackgroundWorker и перезаписать события DoWork и ProgressChanged, как описано в this article. Вы можете обновить метку и другие элементы управления в событии ProgressChanged.

+0

благодарит вас за все ответы – user979033

0

Это очень распространенное требование для длительных процессов. Если вы явно не вызываете методы в отдельном потоке, они автоматически запускаются в основном потоке (см. UI) и заставляют ваш пользовательский интерфейс работать (как я подозреваю, вы уже знаете).

http://www.dotnetperls.com/backgroundworker

Вот старая, но отлично ссылка с примером о том, как использовать фоновую работнику для обработки ThreadPool для вас.

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