Google Earth を使用するアプリケーションがあります。ボタンをクリックすると、新しいフォームがポップアップします。ユーザーがメイン フォームで Google Earth 上の場所をクリックしている間、このフォームは表示されたままになります。このフォームがポップアップした後、ユーザーが「OK」または「キャンセル」をクリックするのを待つループが実行されます。現在、ポップアップが表示されている間、Google Earth のメイン フォームをユーザーが操作することはできません。
それにアプローチする最善の方法さえわからないので、関連するものを探すのは難しいです。
これが私がこれまでに試したことです:
これは、以下のすべてに共通する、ボタンが押された後のコードの最初の部分です。
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());
}
そして、それは私にとって完全に異質であり、非常に速く実行されているように見えるため、実際にはまったく並行していません。
誰でもここで何か提案できますか?
ありがとう。