2012-12-07 2 views
1

내가 작업하고있는 응용 프로그램에는 여러 가지 양식이 있습니다. 하나는 3D 이미지를 표시하기위한 목적으로 사용되고, 다른 하나는이를 관리하는 데 사용됩니다. 이미지의 일부 변경 사항은 시간이 오래 걸리며 진행되는 동안 두 가지 양식이 다시 그려지지 않습니다.다른 스레드의 양식을 사용하는 Winforms 응용 프로그램

내가 얻으려는 것은 최소한 사용자와의 상호 작용을 계속하고 다시 그려지는 양식 (최소한 표준 구성 요소로만 구성된)을 제어하는 ​​것입니다. 내가 보는 방법, 그것을 다른 스레드로 이동해야합니다, 지금 쓰레드가 너무 바쁘기 때문에.

어떻게해야합니까? Wil Application.Run (secondForm)으로 충분합니까?

+0

'Application.Run'이 (가) 차단되지 않습니까? –

+0

msdn을 확인한 후 예, 그렇습니다. 아마 다른 스레드의 내부에서 그것을 호출 할 것입니다. – Srv19

+0

그것은 중복되지 않습니다,하지만 당신은이 [질문] (http://stackoverflow.com/questions/7568376/multiple-ui-threads-winforms?rq=1)에서 좋은 시작을 얻을 수있을 것 같아요. – Steve

답변

2

다른 스레드에서 무거워해야합니다. 백그라운드 작업자를 사용하여 작업을 쉽게 유지하거나 자신의 스레드를 관리 할 수 ​​있습니다. 이 같은

뭔가 :

  • 컨트롤러 폼 프레스 => 스레드/BackgroundWorker에를 시작하고 계산이 완료
  • 에서 계산을 시작, 당신의 이미지 양식을 업데이트합니다. 완료되면 이벤트를 호출하고 이미지/컨트롤러 양식을 구독 할 수 있습니다.
  • 계산이 완료되기 전에 컨트롤러 양식이 변경되면 배경 작업자를 취소하고 다시 시작할 수 있습니다.
0

일반적으로 무거움을 BackgroundWorker에로드하는 것이 가장 좋습니다 (예 : Carra suggested).

질문에 직접 대답 하시겠습니까? 예, 은 별도의 스레드에 양식을 넣을 수 있습니다. 이 경우에는 이상하지 않을 수도 있습니다. 왜냐하면 배경 창이 여전히 많은 시간 동안 응답하지 않기 때문입니다. 하지만 가능합니다.

사용할 거라고 Thread (그리고이 Task 또는 ThreadPool 스레드를 예), 당신은 스레드를 시작하기 전에 대부분의 UI는 하나를 필요로하기 때문에, Thread.SetApartmentState (ApartmentState.STA)를 호출해야합니다 수동으로 생성 - 쓰레기 아파트. 그런 다음 해당 스레드 내에 Form을 만들고 Application.Run 또는 Form.ShowDialog를 호출 할 수 있습니다.

물론 모든 일반적인 스레딩 제한이 적용됩니다 (폼과 컨트롤은 스레드를 만든 스레드에서만 액세스 할 수 있음).

관련 문제