- - PR -
処理の途中で一度画面を表示するにはどうしたらいいでしょう
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-10-28 14:08
いつもお世話になっております。
また教えてください。 APS.NETで開発をしています。 メソッドの途中で一度画面を表示し、続きの処理をしてから再度画面を表示することができるのでしょうか。 コードは以下のような感じです。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Label1.Visible = True 〜時間のかかる処理〜 Me.Label1.Visible = False End Sub 上記の通り、クリックイベントでLabel1を表示させ、メソッドの終了時にLabel1を非表示します。つまり Me.Label1.Visible = True の直後に一度画面に表示したいのですが、なにか方法はあるでしょうか。 よろしくお願いします | ||||||||
|
投稿日時: 2003-10-28 17:21
今日は
下記の様にすれば出来のでは 時間のかかる処理の前に一旦Responceを返す。 Responceには、下記Refreshを含める <META HTTP-EQUIV='refresh' CONTENT='待ち時間(秒);URL=サーバーURL(時間の掛かる処理を反映した)/'> (又は、JavaScriptのタイマーで待ち時間を設定し)、 待ち時間経過後再度サーバーへ自動的にアクセスする。 但し、待ち時間が短いと間に合わないかも、又長いと遅くなります。 | ||||||||
|
投稿日時: 2003-10-28 18:01
ありがとうございます。
待ち時間については設定が出来ません。現在の状況でいきますと処理の長さは3分〜15分くらいとかなり不定です。待ち時間の設定はきびしいと思います。 もう少し説明を追加させていただきます。 作成しているアプリケーションは検索系です。今のところ、時間がかかる処理になっています。そこで、処理している間、「検索中」と表示したいと考えています。 検索開始のタイミングはボタンクリックなので、そのクリックイベントで「検索中」と画面に表示してから、検索処理をおこない、検索結果表示時には「検索中」を非表示します。 具体的にはこのような流れのことを行いたいのですが、ご存知の方がいらっしゃいましたら教えてください。よろしくお願いします。 | ||||||||
|
投稿日時: 2003-10-28 22:16
3分〜15分というのはどんな処理をしているのでしょう? それだけの処理時間がかかるものをWebの画面でどうこうするのがまずいと思います。 データベースのテーブル構造やSQLの見直しで何とかなりませんか?
たぶん、無理でしょう。 絶対無理なのかどうかは断言できませんが、 HTTPの仕組みからいって可能であるとしてもだいぶ無茶な話になってくると思います。 #いやいや簡単にできるというのであれば、ぜひ教えていただきたいです。 #無理な場合も人にこういう理由で無理というのを正確に説明できるようになりたいものです。 以下は、現実的な解となりうるかどうか、本当に可能かどうかは別にして、 少し考えてみました。最終的に行き詰ってしまい、案にすらなってませんけど。 -- クライアントサイド(ブラウザ)に送ったHTMLの内容をサーバサイド(Webアプリ)から変えることはできません。 つまり、一度「検索中」と表示したのであれば、その内容を変える手は2つです。 1.何らかの手段によって、クライアントサイドから再度リクエストを受け取り、 それをきっかけに「検索中」と表示していないHTMLを送る。 2.JavaScriptなどのクライアントサイドの技術で「検索中」を非表示にする。 1.の「何らかの手段」というのはrvmxさんの投稿にあったrefreshさせる方法や、 JavaScriptで何とかする、などといった方法になります。 しかし、いつ終わるかわからないとなると、適当なタイミングでリクエストを発生させる内容 のHTMLをクライアントサイドに返し、クライアントサイドからのサーバへの再リクエストには ・終わっていない場合→検索中の表示(refreshあり)をするHTMLを送信 ・終わった場合→検索結果の表示(refreshなし)をするHTMLを送信 のような感じになるのではないでしょうか。 後は、サーバ側では最初のリクエストで検索処理を実行しはじめたわけですが、 その検索処理をしているオブジェクトを新たなリクエストから取得できるか? というのが問題になると思います。 Sessionとマルチスレッドを使えばできそうな気がしなくもないですが・・・ 2.のパターンは初回のリクエストと検索終了後以外のリクエストを使わない案ですが、 ・検索終了のきっかけを知る方法がない ・検索処理をしているオブジェクトを検索結果を表示するためのリクエストとを ひもづける方法は? というあたりで煮詰まってしまいました。 | ||||||||
|
投稿日時: 2003-10-28 22:33
Response.Write で ごりごり HTML を書いて、
Response.Flush で ちょっとずつクライアントに現状報告というのはできるかもしれません。 ーー 処理中...1 処理中...2 処理中...3 完了 みたいに。 | ||||||||
|
投稿日時: 2003-10-28 23:07
ASP.NETのはるか昔のASP時代に
dai様言う方法で(Response.Writeなどない時代ですけど)実現したことがあります。 ですのでASP.NETでも頑張れば可能なのかもしれません。 ただ検索で15分というのは常人なら諦めますよね?? | ||||||||
|
投稿日時: 2003-10-28 23:30
(1)タイムアウトを考慮しない場合
<marquee id="marq" style="display:none">検索中...</marquee> を仕掛けておいて、 検索ボタンのクリックイベントで document.all.marq.style.display=''; とすると、同期処理による検索結果が返ってくるまで表示される。 (2)タイムアウトを考慮する場合 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7012&forum=7&10 のように検索処理を非同期で実装し、実行中は「検索中...」を表示しておく。 クライアントでは、metaタグのrefresh、DHTMLのsetInterval、 もしくは手動更新によってリクエストを発行し、 非同期処理終了後に来たリクエストに対して結果を返す。 | ||||||||
|
投稿日時: 2003-10-29 09:37
いろいろなご意見ありがとうございます。
頂きましたご意見を参考に調査させていただきます。 |
1