none
Application.DoEventsによるプロパティ値の影響について RRS feed

  • 質問

  • お疲れ様です。

    Application.DoEvents()について質問したいと思いますが、
    一応、簡単なサンプルコードは以下のようです。

    using System;
    using System.Windows.Forms;
    
    namespace DoEventsTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                this.Load += new EventHandler(Form1_Load);
            }
    
            void Form1_Load(object sender, EventArgs e)
            {
                NavigateAndWait();
            }
    
            private void NavigateAndWait()
            {
                webBrowser1.Navigate("http://www.google.co.jp");
    
                // サイトページが全部ロードされるまで待ち状態
                  while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                {
                    Application.DoEvents();
                }
            }
        }
    }
    
    
    
    

     

    上記のサンプルを簡単に説明したいと思いますが、
    WebBrowserを使ってあるサイトページへNavigateして、
    Navigate処理が終るまで待ち状態させる処理です。

    待ち状態させる処理の内容については
    while文を使ってWebBrowserのReadyState値がCompletedになるまで
    ループさせる方式を使っています。

    また、Navigate処理が進行されるに従って
    ReadyStateの値は以下の順番に変わります。

    Uninitialized → Loading → Interactive → Complete

    while文の中にDoEventsを使うと
    ReadyStateの値が上記のように順調に変わって、
    Navigate処理が無事完了しますが、

    DoEventsをコメントアウトすると
    ReadyStateの値は初期値のUninitializedのまま、
    Navigate処理が終らないのです。

    DoEventsの使用有無によって、
    ReadyState値が変わったり変わらなかったりする
    理由が分からないのですが、

    もし、ご存知の方、ご教授お願い致します。<(_ _)>

    2009年10月20日 1:35

回答

  • Application.DoEvents() をキーワードにググれば最初のページに出てくるので、
    すでにご存知かもしれませんが、下記のサイトに答えがあると思います。

    時間のかかる処理の進行状況を表示する
    http://dobon.net/vb/dotnet/programing/displayprogress.html

    時間がかかる処理での「応答なし」を回避するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/136doevents/doevents.html

    ここを読んでも疑問が解けないとすると、すみませんが自分にはお手上げです。
    他の方の回答をお待ちください。

    • 回答としてマーク 菊地俊介 2009年11月10日 2:30
    2009年10月20日 12:26
  • > 今回テストしてみたところ、DoEvents()を使うことによって
    > WebBrowserのReadyStateプロパティ値が変わらないことが判明されました。
    > (もちろん、ボタン押下などの外部操作はできます。)
    >
    > 現在のところ理由は不明ですが、
    > 多分、DoEvents()の何かの機能による問題だと思います。

    「DoEvents の機能」は関係ないと思いますけど・・・

    少なくとも、DoEvents は Navigate に直接影響を及ぼすものではあり
    ません。

    間接的、副作用的な影響(例えば、他に時間のかかるイベントが発生し
    た場合、それが終了するまで待たされるなど)は、ひょっとしたらある
    かもしれませんが。

    Web サイトや回線の状況によっては、いつまで待っても Navigate が完
    了しない場合 or 時間がかかる場合があります。今回 ReadyState が
    Complete にならない or 時間がかかるのも、そのためではないのですか?

    ReadyState がComplete にならない場合は while は無限ループになりま
    すが、その無限ループの中に DoEvents が有るのと無いのとで何が違う
    でしょうか?

    前者はそのアプリケーションで他のイベント(Form.Load 以外の、例え
    ば Paint)が処理されるのに対し、後者はアプリケーションがフリーズ
    したようになるという違いのみと思います。

    それに対応するには、例えば Timer を設けて、Naviagte 後一定時間が
    経過しても HtmlDocument.Complete イベントが発生しない場合、次の
    URI へ Navigate するなどの手段を取るのがよいと思います。

    • 回答としてマーク 菊地俊介 2009年11月10日 2:30
    2009年10月23日 16:00

すべての返信

  • Application.DoEvents() をキーワードにググれば最初のページに出てくるので、
    すでにご存知かもしれませんが、下記のサイトに答えがあると思います。

    時間のかかる処理の進行状況を表示する
    http://dobon.net/vb/dotnet/programing/displayprogress.html

    時間がかかる処理での「応答なし」を回避するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/136doevents/doevents.html

    ここを読んでも疑問が解けないとすると、すみませんが自分にはお手上げです。
    他の方の回答をお待ちください。

    • 回答としてマーク 菊地俊介 2009年11月10日 2:30
    2009年10月20日 12:26
  • SurferOnWwwさん。

    ご回答ありがとうございます。

    張ってくださったリンクURLの内容と同じように
    DoEvents()の機能は内部処理をしている間、
    外部操作もできるようにやってくれるのだと存じておりますが、

    今回テストしてみたところ、DoEvents()を使うことによって
    WebBrowserのReadyStateプロパティ値が変わらないことが判明されました。
    (もちろん、ボタン押下などの外部操作はできます。)

    現在のところ理由は不明ですが、
    多分、DoEvents()の何かの機能による問題だと思います。

    もうちょっと、テストしながら調べてみます。

    いつも良い情報、ありがとうございます。 <(_ _)>
    2009年10月22日 4:15
  • > 今回テストしてみたところ、DoEvents()を使うことによって
    > WebBrowserのReadyStateプロパティ値が変わらないことが判明されました。
    > (もちろん、ボタン押下などの外部操作はできます。)
    >
    > 現在のところ理由は不明ですが、
    > 多分、DoEvents()の何かの機能による問題だと思います。

    「DoEvents の機能」は関係ないと思いますけど・・・

    少なくとも、DoEvents は Navigate に直接影響を及ぼすものではあり
    ません。

    間接的、副作用的な影響(例えば、他に時間のかかるイベントが発生し
    た場合、それが終了するまで待たされるなど)は、ひょっとしたらある
    かもしれませんが。

    Web サイトや回線の状況によっては、いつまで待っても Navigate が完
    了しない場合 or 時間がかかる場合があります。今回 ReadyState が
    Complete にならない or 時間がかかるのも、そのためではないのですか?

    ReadyState がComplete にならない場合は while は無限ループになりま
    すが、その無限ループの中に DoEvents が有るのと無いのとで何が違う
    でしょうか?

    前者はそのアプリケーションで他のイベント(Form.Load 以外の、例え
    ば Paint)が処理されるのに対し、後者はアプリケーションがフリーズ
    したようになるという違いのみと思います。

    それに対応するには、例えば Timer を設けて、Naviagte 後一定時間が
    経過しても HtmlDocument.Complete イベントが発生しない場合、次の
    URI へ Navigate するなどの手段を取るのがよいと思います。

    • 回答としてマーク 菊地俊介 2009年11月10日 2:30
    2009年10月23日 16:00
  • 皆様、こんにちは。

    SurferOnWwwさん、回答ありがとうございます。

    tristan28さん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか。疑問は解決しましたか?
    有用な情報と思われたため、SurferOnWwwさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    2009年11月10日 2:38