トップ回答者
Application.DoEventsによるプロパティ値の影響について

質問
-
お疲れ様です。
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値が変わったり変わらなかったりする
理由が分からないのですが、もし、ご存知の方、ご教授お願い致します。<(_ _)>
回答
-
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
-
> 今回テストしてみたところ、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
すべての返信
-
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
-
SurferOnWwwさん。
ご回答ありがとうございます。
張ってくださったリンクURLの内容と同じように
DoEvents()の機能は内部処理をしている間、
外部操作もできるようにやってくれるのだと存じておりますが、
今回テストしてみたところ、DoEvents()を使うことによって
WebBrowserのReadyStateプロパティ値が変わらないことが判明されました。
(もちろん、ボタン押下などの外部操作はできます。)
現在のところ理由は不明ですが、
多分、DoEvents()の何かの機能による問題だと思います。
もうちょっと、テストしながら調べてみます。
いつも良い情報、ありがとうございます。 <(_ _)> -
> 今回テストしてみたところ、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