• 締切済み

フォームが表示されるのが遅い

お世話になっております。 最初にForm1_Loadイベントでiniファイルで初期設定をロードしたり、複数のCSVファイルからデータを読み込んでFor~Nextで配列に入れたりする処理をしているのですが、データ多いためフォームが表示されるまでに2秒ほど待たされてしまいます。 フォームを表示してから行いうにはどうしたらいいでしょうか。Application.DoEvent()をループ内に記述してみたりしましたが、効果は見られませんでした。初期設定をLoadではなく、ほかのイベントに記述するしかないでしょうか? タイマーで時間をずらしたりなどで出来ないことは無いかもしれませんが、無駄も多くなりそうなので一番一般的な方法を知りたいです。 よろしくお願いいたします。

みんなの回答

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.3

#1です。 >>「別スレッド」などという言葉が出てきて初心者の僕にはちょっと荷が重いです スレッドについては以下のMSDNの解説なんかわかりやすいと思います。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnbprocs/htm/progCharp15-01.asp >>別なクラスから呼び出すと、勝手に非同期になるのでしょうか。 なりません。 私の言い方がよくなかったのかと思いますが、非同期で動かすには別スレッドで動かす必要があります。 ただ、非同期実行させる際、オブジェクト指向プログラミングでは 別クラス(のオブジェクト)に処理を任せることが多いです。(これを「委譲」といいます。VBなどVisual Stadioではこれを「デリゲート」と呼んでいたりします。) >>それともやはり非同期で実行するようにコーディングしなおす必要があるでしょうか。 おっしゃる通り、マルチスレッドのプログラミングにはそれなりのコーディングは必要です。 しかし、用意されているライブラリを利用するだけなので慣れてしまえば大したことはありません。 よさそうなサイトがあったので、↓に紹介しておきます。 http://codezine.jp/a/article.aspx?aid=135

new_hope
質問者

お礼

お返事おくれてしまいました。 現在教えていただいたページを参考にしつつ、マルチスレッドに挑戦しております。 とりあえず現在は、ロードイベントの一番最初に Me.Show() と記述してそのあとから初期設定をおこなうようにしたところ、 最初にフォームが表示されるようになりました。 どうもありがとうございました。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

先に表示させても結局待たせることには変わりなく(どこかをクリックされてしまうと困るので制限を加えるのでしょうし)、プログレスバーなどでLoad時の状況を見せつつ、間を持たせたいということなら、スプラッシュ画面を使うのが一般的だと思います。 http://www.atmarkit.co.jp/fdotnet/dotnettips/223splashscrn/splashscrn.html

new_hope
質問者

お礼

アドバイスありがとうございます。 スプラッシュウィンドウは今のところ考えておりません。

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

>>フォームを表示してから行いうにはどうしたらいいでしょうか 方法としては、CSVを読み込むクラス(仮名classA)を作って、 ロード時にclassAを呼び、非同期に実行させます。 classAは読み込みが完了すれば、もとのフォームにその旨を通知すればいいです。 しかし、そもそもフォームを先に表示させてもかまわないということは ロード時にCSVなどに書かれたデータを必要としないということですよね? どのような設計をしているのかは知りませんが、 必要なタイミングでCSVを読み出せばいいかと思うのですが‥。

new_hope
質問者

お礼

早速のご回答ありがとうございます。 プログラムの動作に必要なファイルなので最初に読み込む必要があるのですが、せめて必要プログラムを表示し、待たせる場合はプログレスバーなどで対応したいと思っています。やはり実行ファイルをクリックして2秒3秒待たされるのは、使う人は気分が悪いと思うので・・・。 非同期というのはいろいろ便利そうなので検索してみましたが、「別スレッド」などという言葉が出てきて初心者の僕にはちょっと荷が重いです。いずれ勉強してみますが・・・。 別なクラスから呼び出すと、勝手に非同期になるのでしょうか。それともやはり非同期で実行するようにコーディングしなおす必要があるでしょうか。恐れ入りますが、もしよろしければ詳しく教えていただけ無いでしょうか。

関連するQ&A