코드 읽을 때 : 진행률 막대 형태로진행률 표시 줄의 값은 동일하게 유지하는 이유는 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 시작하고 좀 이상 할 수 있을까? 시간 내 주셔서 감사합니다.
정말 고마워요, 당신 말이 맞아요. 그러나 백그라운드 워커를 사용하여 내 조프를했습니다. 다시 감사 드리며 요점을 얻습니다. – user2826759