2009-11-17 5 views
0

사용자가 이미지를 선택하면 (fileOpenDialog 사용)이 이미지에서 3 개의 알고리즘을 순차적으로 실행해야합니다 (하나의 출력은 다른 입력의 입력이됩니다). 그래서, 나는이 알고리즘을 실행하기 위해 배경 작업자를 사용하고 있습니다.왜이 winform이 응답하지 않게됩니까?

각 단계가 끝나면 결과 이미지를보고 싶습니다. 이를 위해 PictureBox 컨트롤이 포함 된 단순한 형식 인 ImageViewer 클래스를 만들었습니다. 이것은 무엇에서 진행되고있는 것입니까

backgroundworker1_dowork() 
    { 
     Image img1 = runAlgo(img); //this statment is executing fine 
     ImageViewer imgviewer1 = new ImageViewer(img1); 
     imgviewer1.show(); 
    } 

이제는 imgviewer1이 응답하지 않게됩니다 (제목이 표시되지 않음). 거기에는 이미지가 없습니다.

//ImageViewer constructor 
ImageViewer(Image img) 
{ 
this.pictureBox1.Image = img; 
} 

답변

3

나는 각 알고리즘의 경우 BackgroundWorker를 사용하고있는 BackgroundWorker의 RunWorkerComplete 이벤트에 다음 코드를 넣어 제안 다른 스레드에서 실행될 때 DoWork 이벤트에서 UI를 업데이트하는 것이 좋습니다. 작동 시키려면 해킹/호출 등을 약간 구현해야합니다. BackgroundWorker를 원래대로 사용하는 것이 훨씬 낫습니다. 나는. 작업을 한 다음 결과를 반환하십시오.

1

백그라운드 작업자의 작업은 UI 스레드가 아닌 다른 스레드에서 실행됩니다. Dispatcher.Invoke를 사용하여 UI를 업 데이트 할 일부 코드가 UI 스레드에서 실행되는지 확인할 수 있습니다. 'e.Result = img;

내가 같으면

ImageViewer imgviewer1 = new ImageViewer((Image)e.Result); 
    imgviewer1.show(); 

가 사용 DoWork 이벤트 결과를 다시 전달합니다

+0

안녕하세요, fredrik ... 담당자에게 무슨 일이 일어 났습니까? 너는 다른 날에 그 힙을 가지고 있지 않니? –

0

할당하기 전에 ImageViewer 생성자에서 초기화 구성 요소가 호출됩니까?

1

하나의 ImageViewer 인스턴스를 만드는 전략을 사용하는 것이 좋습니다.이 인스턴스 (메서드 또는 속성)의 내부 PictureBox에 이미지를 설정하는 코드를 작성하십시오.

확인하고 각 BackgroundWorker에 호출에 대한 RunWorkerCompleted 이벤트를 처리하고 오류를 검사 : 가능한 합병증의 일부 세부 사항이를 참조하십시오

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted.aspx

당신의 연속 BackgroundWorker에 각 각 완전한 복귀 후 호출하고 ImageViewer의 단일 인스턴스에서 이미지를 설정하고 '무효화'또는 '무효화'를 사용하여 강제로 화면을 다시 그립니다. 최고,

관련 문제