2012-01-06 9 views
2

내가 작성한 프로젝트에 프로세스가 있습니다. 시간이 걸리며 진행률 표시 줄을 사용하고 싶습니다. 사용자가 버튼을 클릭하여 프로세스와 ProgressBar를 취소 할 수있게하려고합니다. 프로세스가 실행 중일 때 사용자가 해당 양식의 다른 컨트롤을 클릭하지 못하도록하고 싶습니다. 스레드를 사용하면 폼의 다른 컨트롤을 클릭 할 수 있습니다.버튼을 클릭하여 프로세스를 취소합니다.

아마도 한 가지 해결책은 다른 양식을 사용하고 두 번째 양식에서 ProgressBar 및 취소 버튼을 설정하는 것일 수 있습니다. 그러나 내 프로세스에 따라 ProgressBar의 값을 어떻게 설정할 수 있습니까? 첫 번째 형식에 참여하고 있습니다.

해결책은 무엇입니까?

미리 감사드립니다.

답변

1

BackgroundWorker을 사용하십시오. 첫 번째 폼에 추가하고 BackgroundWorker 진행률에서 이벤트 변경 진행 막대 값을 변경했습니다. 설명서에 표시된 예제를보십시오.

2

BackgroundWorker을 사용하면 진행 상황을보고하고 취소 할 수있는 API를 제공합니다.

2

대화 상자를 사용하는 것이 가장 좋으며 나머지 UI에 자동으로 액세스 할 수 없게합니다. 새 폼을 프로젝트에 추가하고 ProgressBar와 Button을 드롭합니다. 당신이 당신의 기본 폼에 이벤트 핸들러에서 진행 표시 줄을 업데이트 할 수 있도록 공용 메서드를 추가

public partial class ProgressDialog : Form { 
    public ProgressDialog() { 
     InitializeComponent(); 
    } 
    public void ShowProgress(int progress) { 
     progressBar1.Value = progress; 
    } 
    private void CancelProcess_Click(object sender, EventArgs e) { 
     this.DialogResult = DialogResult.Cancel; 
    } 
} 

당신이 노동자 시작할 때이 대화 상자를 표시해야합니다 :

ProgressDialog dlg; 

    private void RunProcess_Click(object sender, EventArgs e) { 
     backgroundWorker1.RunWorkerAsync(); 
     using (dlg = new ProgressDialog()) { 
      dlg.ShowDialog(this); 
     } 
     dlg = null; 
     if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync(); 
    } 

주 작업자를 중지시키기 위해 CancelAsync()를 호출하는 방법으로 대화 상자를 닫으면 멈출 수 있습니다. 당신은 진행률 표시 줄을 업데이트해야합니다

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { 
     dlg.ShowProgress(e.ProgressPercentage); 
    } 

을 그리고 당신은 노동자가 완료되면 자동으로 대화 상자를 닫습니다 필요하고 사용자가 대화 상자 자신 닫지했습니다

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
     if (dlg != null) dlg.Close(); 
    } 
+0

내가 쓴해야 해당 특수 프로세스의 코드는 "if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();"줄에 썼습니다. 그 프로세스를 실행 한 후 새 양식이 사용 가능으로 표시되고 아무것도 표시되지 않았습니다.이 문제점을 어떻게 해결할 수 있습니까? –

+0

백그라운드 작업자를위한 DoWork() 이벤트 처리기에이 이벤트를 씁니다. –

+0

그 문제는 해결되었지만 다른 하나는 발생합니다.이 과정에서 폼에있는 일부 컨트롤에 액세스해야합니다. 예를 들어 opB라는 버튼을 사용하지 않도록 설정하면 프로젝트를 실행하면 콜트 롤에 오류가 발생합니다. 예를 들어 이 오류 : "크로스 스레드 작업이 유효하지 않습니다 : 'opB'가 생성 된 스레드 이외의 스레드에서 액세스 제어하십시오." 지금 어떻게해야합니까? –

관련 문제