2012-03-06 3 views
1

파일이 AVI가 아닌 경우 자동으로 변환하지만, 파일을 변환하는 파일이 이제 다른 형식으로 변환되는 레이블에 쓸 때 원하는 경우 ListBox가 있습니다. UI 스레드를 업데이트하려면 Dispatcher를 사용해야하지만 WPF 대신 Winform을 사용해야하므로이 기능에 대한 도움이 필요합니다. 내가 레이블 변경업데이트 UI 스레드

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); 
     } 
    } 
} 

이 기능의 필요성을 닷넷 3.5을 사용하고 있기 때문에 BTW 내가 작업을 사용할 수 없습니다 질문에서

 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 클래스를 사용하고 this article에 설명 된대로 DoWork 및 ProgressChanged 이벤트를 덮어 쓸 수 있습니다. ProgressChanged 이벤트에서 레이블 및 기타 컨트롤을 업데이트 할 수 있습니다.

+0

모든 답장을 보내 주셔서 감사합니다. – user979033

0

이것은 장기 실행 프로세스의 매우 일반적인 요구 사항입니다. 별도의 스레드에서 메서드를 명시 적으로 호출하지 않으면 해당 스레드는 자동으로 주 스레드 (UI 참조) 스레드에서 실행되어 사용자 인터페이스가 작동하게합니다 (이미 알고있는 것으로 의심됩니다). 여기

http://www.dotnetperls.com/backgroundworker

당신을위한 스레드를 처리하는 배경 노동자를 사용하는 방법에 대한 예와 오래지만, 우수한 링크입니다.

이 방법을 사용하면 별도의 스레드에서 변환 프로세스를 관리하는 작업자를 만들 수 있으며 프로세스 막대를 만드는 예제도 있다고 생각합니다.