0

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());
    }

そして、それは私にとって完全に異質であり、非常に速く実行されているように見えるため、実際にはまったく並行していません。

誰でもここで何か提案できますか?

ありがとう。

4

1 に答える 1

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
     });
}
于 2013-05-02T21:06:20.903 に答える