2013-05-02 2 views
0

У меня есть приложение, которое использует Google Earth. Я нажимаю кнопку, и появляется новая форма. Эта форма сохраняется, пока пользователь щелкает места на земле 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 (dr1 != DialogResult.OK & dr1 != DialogResult.Cancel) 
     { 
      //do stuff 
     } 

Использование "Parallel.For":

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

Это не удается, потому что я не знаю, как заставить его ждать, пока я нажму на диалоговые окна.

Использование этого параметра «Параллельное время» http://blogs.msdn.com/b/pfxteam/archive/2009/08/12/9867246.aspx: Параллельные параллельные вычисления = новые 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 я не знаю, как контролировать, как долго он работает с вводом формы.Я верю, что если я реализую ваши предложения, то форма TotArea не будет нести ответственность за длину итераций цикла? –

+0

И кажется, что это предложение ждет пользовательский ввод перед запуском цикла. Мне нужен цикл для запуска UNTIL, когда пользователь нажимает OK или Cancel. –

Смежные вопросы