2013-10-04 1 views
0

코드 읽을 때 : 진행률 막대 형태로진행률 표시 줄의 값은 동일하게 유지하는 이유는 RegistryKey 기본 폼에

private delegate bool IncreaseProbarHandler(int nIncVal); //Declare a delegate to increase the progress bar value. 
    private IncreaseProbarHandler _IncHanler = null; 
    private List<Microsoft.Win32.RegistryKey> _RKeys = new List<Microsoft.Win32.RegistryKey>(); //Store the RegistryKey. 
    public MainForm() { 
     InitializeComponent(); 
    } 

    private void MainForm_Load(object sender, EventArgs e) { 
     new Thread(ProThread).Start(); 
     RecursiveRegedit(Microsoft.Win32.Registry.CurrentUser); 
     //RecursiveRegedit(Microsoft.Win32.Registry.LocalMachine); 
     MessageBox.Show("Done!"); 
    } 
    //Recursive scan the registry. 
    void RecursiveRegedit(Microsoft.Win32.RegistryKey regBoot) { 
     if(regBoot == null) throw new ArgumentNullException("Null Item!"); 
     string[] vals = regBoot.GetValueNames(); 
     foreach(var v in vals) { 
      if(regBoot.GetValue(v) != null) { 
       string s = regBoot.GetValue(v).ToString(); 
       if(s.StartsWith("C:", StringComparison.CurrentCultureIgnoreCase)) 
        _RKeys.Add(regBoot); //Add to 'List'. 
      } 
     } 
     if(regBoot.SubKeyCount <= 0) //Exit. 
      return; 
     else { //Recursive. 
      string[] subs = regBoot.GetSubKeyNames(); 
      foreach(string s in subs) { 
       try {//Try...catch the not accessible notes exception. 
        RecursiveRegedit(regBoot.OpenSubKey(s, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl)); 
       } 
       catch { 
       } 
      } 
     } 
     regBoot.Close(); //Close. 
    } 
    /// <summary> 
    /// Show Progress bar form. 
    /// </summary> 
    void ShowProbar() { 
     ProgressBarForm proForm = new ProgressBarForm(); 
     _IncHanler = new IncreaseProbarHandler(proForm.IncreaseProbarVal); 
     proForm.Show(); 
    } 
    /// <summary> 
    /// Sub Thread to perform the progress bar. 
    /// </summary> 
    void ProThread() { 
     MethodInvoker mInvoker = new MethodInvoker(ShowProbar); 
     this.BeginInvoke(mInvoker); 
     Thread.Sleep(1000); 
     bool incResult = false; //The status each time when trying to increase the progress bar value. 
     do { 
      Thread.Sleep(5); 
      incResult = (bool)this.Invoke(this._IncHanler, new object[] { 2 }); 
     } while(incResult); 
    } 

코드 :

/// <summary> 
    /// Increase the value of the progress bar. 
    /// </summary> 
    /// <param name="incVal">The value to increase.</param> 
    /// <returns>True if increase successful,otherwise false.</returns> 
    public bool IncreaseProbarVal(int incVal) { 
     if(incVal <= 0) throw new ArgumentOutOfRangeException("Increase value can't the a negative."); 
     if(proBar.Value + incVal < proBar.Maximum) { 
      proBar.Value += incVal; 
      return true; 
     } 
     else { 
      proBar.Value = proBar.Maximum; 
      return false; 
     } 
    } 

설명 : 내가 읽은 을 기본 폼의 레지스트리 키 값은 try catch 문을 재귀 적으로 사용합니다. 새 스레드가 진행 막대 모양을 수행하기 시작했습니다. 현재 문제는 앱을 실행할 때 진행 막대 모양이 표시되지 않는다는 것입니다. 메인 양식이 끝났을 때 표시됩니다 (그러나 프로 그램 막대의 값은 그대로 유지되거나 증가하지 말라고 말함). 어떤 사람들은 메인 홉이 블록이 아니며 진행률 막대를 수행 할 여유 시간이 있는지 확신 할 수 있는지 여부를 말했습니다.이 점에 대해 혼란스럽고 단지 '블록'또는 다른 것을 사용하지 않습니다. 다른 질문, 또는 당신은 나를 someting 시작하고 좀 이상 할 수 있을까? 시간 내 주셔서 감사합니다.

답변

0

어떤 불필요한 스레딩과 Invoke() ing. = \

는 "기본 양식이 완료되면 현재의 문제는 app.It 실행시 진행 바 형태로 표시되지 않고 있음을 보여줍니다"

RecursiveRegedit (에 대한 귀하의 호출) 메인 스레드의 UI에서 실행중인

... 따라서 아무것도 재귀 호출이 완료 될 때까지 업데이트 할 수 있습니다.

ProThread()를 사용하는 것처럼 다른 스레드에서 RecursiveRegedit()를 실행해야합니다.

+0

정말 고마워요, 당신 말이 맞아요. 그러나 백그라운드 워커를 사용하여 내 조프를했습니다. 다시 감사 드리며 요점을 얻습니다. – user2826759

관련 문제