2

プログラムがページを完全にロードするのを待ってから、プログラムが続行し、ロードされたドキュメントでさらにコードを実行する方法を探しています。

私はそれを行うための良い方法を見つけられませんでしたがMessageBox.Show("some string");、プログラムを使用すると停止/待機(?)し、ループ中でも続行することを思い出しました。

したがって、このループがある場合:

for (int i = 0; i < 10; i++)
{
    MessageBox.Show("i");
}

OKボタンを押すまで実行されi++ません。

彼らはどうやってそれをすることができましたか?

4

3 に答える 3

4

MessageBox.Show()モーダルウィンドウを表示します。MessageBox.Show()の呼び出しは、ダイアログがユーザーによって閉じられるまでブロックされます。

于 2012-11-05T19:05:32.233 に答える
2

編集:はい、ダイアログは.NETの単なるwhileループではありません。私は、MessageBox.Showが質問の作成者が尋ねたようにブロックする理由の簡単な説明を伝えようとしただけです。以下の文言をより適切に修正しました。

ページが完全に読み込まれるのを待つ必要がある場合は、ページがいつ終了するかを判断するために、何らかのトリガーを追加する必要があります。

for (int i = 0; i < 10; i++)
{
     MessageBox.Show("i");
}

次のように書くことができます:

for(int i = 0; i < 10; i++)
{
    bool isRunning = true;
    while(isRunning)
    {
       isRunning = CheckIfSomethingIsStillRunning();
       Thread.Sleep(10);
    }
}

基本的に、スレッド/プログラムを続行する必要があると判断するまで、ループを継続する必要があります。

MessageBox.Show()がブロックされる理由は、Windowsが実際には、メッセージを常に受信してペイントしているwhileループで実行されているためです。ダイアログ(Window.ShowDialog()、MessageBox.Show())を表示すると、ウィンドウが閉じられるのを待つのをブロックし続けるメソッドがあります。

これがお役に立てば幸いです。

于 2012-11-05T19:23:40.853 に答える
0

一般的に言って、Microsoftライブラリ関数の背後にあるコードは公開されていませんが、同様のことを実現する方法をいくつかの擬似コードで示します。

Show()
{
    DisplayMessageBox();

    while(Ok button is not pressed)
    {
        WaitAFewMilliseconds();
    }
    HideMessageBox();
}

イベントベースの入力のような他のパラダイムもあります。

さて、これが他のすべてをハングアップさせない理由は、マルチスレッドのためです。同時に実行される2つのスレッドがあるとします。オペレーティングシステムは、一方のスレッドを数行実行し、次にもう一方のスレッドを数行実行するため、同時に発生しているように見えます。

これで、ダイアログボックスはおそらくそれを呼び出したスレッドと同じスレッドにあります(そのため、i ++は実行されません)が、入力を検出しているものはすべて別のスレッドにある可能性があります。

于 2012-11-05T19:13:11.667 に答える