2013-05-02 5 views
0

Google 어스를 사용하는 애플리케이션이 있습니다. 버튼을 클릭하면 새 양식이 나옵니다. 이 양식은 사용자가 Google 어스의 장소를 기본 양식으로 클릭하는 동안 계속 표시됩니다. 이 양식이 팝업되면 사용자가 "확인"또는 "취소"를 클릭 할 때까지 기다리는 루프가 실행됩니다. 현재 팝업이있는 동안 사용자가 메인 어스 양식과 상호 작용할 수 없습니다.병렬 스레드? 루프?

관련성 높은 항목을 찾기가 어렵 기 때문에 접근 방법이 확실하지 않습니다. 여기

는 지금까지 시도했습니다 내용은 다음과 같습니다

이 아래 모든 것에 공통 버튼을 누른 후 코드의 첫 번째 부분 :

  Form TotArea = new ASPE.GUI.OptimizationWizard.TotalArea(); 
      DialogResult dr1 = new DialogResult(); 
      Thread t = new Thread(() => dr1 = TotArea.ShowDialog()); 
      t.Start(); 
      //TotArea.TopMost = true; 
      bool firstcall = true; 
      dynamic[] polystuff = null; 

단순히 while 루프 후 실행 대화 상자가 (난이 실패 할 줄 알았) 팝업 :
 while (dr1 != DialogResult.OK & dr1 != DialogResult.Cancel) 
     { 
      //do stuff 
     } 

는 "Parallel.For를"사용 :

 Parallel.For(0, 1, i => 
     { 
     //do stuff 
     }); 

대화 상자를 클릭 할 때까지 기다리는 방법을 모르므로 실패합니다.

"Parallel While"사용 http://blogs.msdn.com/b/pfxteam/archive/2009/08/12/9867246.aspx : ParallelOptions paralleloptions = new ParallelOptions();

 Func<bool> condn =() => (dr1 != DialogResult.OK | dr1 != DialogResult.Cancel); 
     Action whilebody =() => 
     { 
      //do stuff  
     }; 

그리고 이러한 기능 :

 While(paralleloptions, condn, whilebody); 
    private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition) 
    { 
     while (condition()) yield return true; 
    } 
    public static void While(
ParallelOptions parallelOptions, Func<bool> condition, Action body) 
    { 
     Parallel.ForEach(IterateUntilFalse(condition), parallelOptions, 
      ignored => body()); 
    } 

그리고 그 날 완전히 외국인이다, 너무 많이 너무 빨리 전혀 병렬 정말 아니라는 것을 실행하는 것 같다.

누구든지 여기에 무엇을 제안 할 수 있습니까?

감사합니다.

+0

왜 바쁜 루프를 실행하고 있습니까? 'ShowDialog'를 호출하면'ShowDialog'가 반환 될 때까지 해당 스레드의 실행을 일시 중지합니다 (두 번째 폼을 닫음). 두 폼을 모두 표시하고 대화식으로 표시하려면'Show '를 호출하십시오. – Thelonias

답변

1

ShowDialog는 대화 상자 결과가 반환 될 때까지 실행을 중단해야합니다. 대화 상자를 별도의 스레드에 표시하기 때문에 현재 대화 상자가 중단되지 않습니다.

당신은 Parallel.For를 사용하여 돌아가서 바로 여기에 코드를 변경할 수 있습니다

if (DialogResult.OK == TotArea.ShowDialog()) 
{ 
    Parallel.For(0, 1, i => 
    { 
      //do stuff 
    }); 
} 
당신이 배경을해야 할 경우에도 Task.Factory를 사용할 수

:

var task = Task.Factory.StartNew(() => { return TotArea.ShowDialog(); }); 
task.Wait(); 
if (task.Result == DialogResult.OK) 
{ 
    Parallel.For(0, 1, i => 
    { 
      //do stuff 
    }); 
} 
+0

Parallel for my problem 내가 양식 입력을 실행하는 방법을 제어하는 ​​방법을 모르겠다. 나는 당신의 제안을 구현하면 TotArea 양식 루프 반복 실행의 길이에 대한 책임을지지 않습니다 믿습니다? –

+0

그리고 그것은이 제안을 기다리는 것처럼 보입니다. 사용자 입력을 루프를 실행하기 전에. 사용자가 확인 또는 취소를 클릭 할 때까지 루프를 실행해야합니다. –