2011-07-30 5 views
0

원격 설치를 수행하는 프로그램을 만들고 싶습니다. 각 설치가 시작될 때 창을 띄울 수 있고 작업 진행 상황을 보여주는 진행률 막대를 표시하고 싶습니다.다중 스레드 다중 창 응용 프로그램이 작동하지 않습니다.

주 스레드에서 창을 만들면 모든 요소에 액세스 할 수 있지만 실제로 설치를 실행하는 작업으로 인해 응답하지 않습니다. 새 스레드에서 창을 시작하면 진행 막대를 업데이트 할 수 없기 때문에 주 스레드에서 창 요소를 인식하지 못하는 것 같습니다.

어떻게 반응 형 멀티 스레드 UI를 만들 수 있습니까?

+0

평소보다 무거운 편집을했지만 chattiness를 없앴습니다. 내가 남긴 것은 실제 질문입니다. –

+0

BTW,이 WPF 아닌 WinForms 응용 프로그램을 가정합니까? –

답변

0

두 번째 스레드에서 작업을 수행하고 두 번째 스레드에서 UI를 업데이트 할 수있게하려면 컨트롤에서 Invoke를 사용해야합니다. 많은 코드가 있습니다. 여기

짧은 예제 : cross threading problem - - - 단지 검색 :

여기 그래서 오늘은 다른 비슷한 질문이야을 당신은 SO뿐만 아니라 여기에 예를 수십 찾을 수 있습니다

How can I update my user interface from a thread that did not create it? 코드 예제있다 대답 중 하나에

0

Control.BeginInvoke(lambda) 메서드로 람다를 호출하는 다른 스레드에서 UI 컨트롤에 안전하게 액세스하는 간단한 방법이 있습니다. 예를 들어, 하나의 양식과 버튼이있는 진행 막대가있는 WinForms 응용 프로그램이 있다고 가정합니다. 버튼을 클릭하면 가상 작업이 별도의 스레드에서 진행되고 진행률 표시 줄이 업데이트됩니다. 가장 간단한 그런 것을 작성하는 것입니다 :

private void button1_Click(object sender, EventArgs e) 
{ 
    ThreadStart s =() => 
    { 
     for (int i = 0; i <= 10; i++) 
     { 
      Action a =() => progressBar1.Value = i * 10; 
      BeginInvoke(a); 
      Thread.Sleep(300); // imitate some workload 
     } 
    }; 
    var t = new Thread(s); 
    t.Start(); 
} 

같은 결과가 BackgroundWorker 또는 다른 기술로 얻을 수있는,하지만이 나를 위해 같은 가장 간단합니다.

관련 문제