いつもお世話になっております。実現したいことに対して分からないことが多々あり、質問のタイトルをどうするか迷いましたが、まとめると表題のようになります。
〇実現したいこと
現状、メインフォームから別フォームを開いて閉じ、開いて閉じを繰り返しています(メインフォームは閉じない)
この別フォームを開く処理が遅いという指摘があったので、速くするために以下のように、メインフォームのLOADイベントで別フォームを開いておいて隠しておけばいいかなと思っています。
vb.net
1Private Sub form1 2 Dim f as New Form2 3 f.show() 4 f.hide() 5End sub 6 7Private Sub Button1_click 8 Dim f as Form2 9 f.show 10 me.hide 11End Sub
そしてbutton1_clickで開けばいいと思っているのですが、
このとき以上のようにするのは間違っていますか?
Newの使い方が分かっていません。
まずは何の処理に時間がかかっているのか計測して、その処理がLoadイベントで実行しなくてはいけないものなのか、ほかのタイミングで処理できるものなのかを検討すべきです。
https://teratail.com/questions/300024 複垢使って都合が悪くなると消すということに反省はないですか?
実際に動かしてみれば、間違っているかどうかすぐ判ると思うんですが。
そもそもNewを理解せず開発してる時点でまずいので、言語リファレンスから学習し直した方が良い気がしますが…基礎を飛ばして今回の問題を行き当たりばったりでクリアしても、すぐに別の問題に直面するでしょう。そして、そういう人はほぼ共通して自分で調査して解決出来ない傾向が見られます。基礎が判らないと、原因の特定や解決方法を自己判断する事も出来ないからです。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/
YAmaGNZ様、回答ありがとうございます。
その処理ではピクチャーボックスをひたすらにnew句で生成しています。なのでそこに時間がかかっているとおもいます。データベースからデータを読み込む時間ももちろんありますが、そこの影響はストップウオッチで測ってピクチャーボックスを生成することよりも小さいことは確認しています。
radian様、回答ありがとうございます。私の質問は丸投げでした。失礼しました。
アドバイス頂いたようにもうちょっとちゃんと基礎から勉強したいと思います。(時間はあるので。)
一応私のやりたいことを言葉で書きますと、このアプリはつけっぱなしにしておくアプリなので、loadイベントは一度きりしか使いません。なのでloadイベントで別フォームを開いておいて、hide句で隠しておきます。そして開く処理(ソースコードではbutton1.click)のタイミングでshow句を使って、隠していた別フォームを出したいと思っています。そうしたら速くなるかと思ったからです。でも私がぶつかった問題点は
loadイベントで
Dim f として宣言したform2ですが、
これをbutton1.clickイベントでshowするには、どうしたら良いのか分からないということです。
何点かアドバイスをするとすれば、
・ローカル変数にフォームのインスタンスを割り当てても、メソッドを抜けた時点で破棄されるので、クラスメンバに保持しておく必要があるでしょう。
・Show後に即Hideしても一瞬表示してチラつきは発生します。(実際に行ってみれば判ると思います)
・画像表示は重い処理ですが、ディスク読み出し⇒デコード⇒描画の3ステップあり、画像を事前にメモリに読み込んで保持しておけば2ステップは解消できるので、許容できる遅さになるかもしれません。
radianさん、やってみたのですが、確かに一瞬表示するのみで、効果はなかったです。
3点目はresourceフォルダに読み込んで実行した方が早いということでしょうか
フォームで画像を読み込むのをやめて、Bitmapを読み込んでクラスメンバとして保持するクラスを用意しておき、EXE起動時に全て画像を読み込んでおけば、画像のディスクからの読み込み自体は一回で済むと思います。Bitmapオブジェクトは、そのクラス経由で取り出すようにすれば良いかと。
https://www.umayadia.com/VBStandard2/Standard06.htm
このvisual basic 中学校さんのページで勉強させていただきました。このページの中間付近で管理人さんはNEW句を無駄に100個も200個も使うプログラムは変えるべきだと書かれていました。まさに今の自分のプログラムだと思います。
クラスとかメソッドとかを勉強したのですが、radianさんの仰るBitmapを読み込んでクラスメンバとして保持するクラスを用意するというのがどうすればいいのかわかりません。
今はfor文でpictureboxのインスタンスを何個も都度生成していますが、どのように変更すればよいか教えてくださいませんか?
まずはYAmaGNZさんの言うように処理に掛かっている時間を計測する事です。Bitmapを事前にメモリに読み込むというのはあくまでアドバイスにしかすぎないので、それで目的が達成出来るかどうかも不明ですし。Stopwatchクラスなどを使用して、どの処理に合計●msec掛かってるな、最低●msec以内に表示出来ないとダメだけど今のままじゃ無理だなというのを自分で把握しないと、どこを性能改善すれば目標達成できるかの目星も付かないでしょう。
ただ、話を聞いている限り、現状のスキルでの自力解決は荷が重そうな気がします。掲示板の回答一つでパッと解決出来る段階ではなさそうなので、周囲に相談できる人が居るなら相談しながら解決策を模索した方がよいでしょう。それが無理なら、作れる会社・個人にお金を出して依頼するしかないですね。時間がたっぷりあるのであれば、試行錯誤を繰り返してみるのもいいかと思います。
radianさん、返信が大変遅れ、申し訳ありません。周囲に相談できる人は悲しいことにいません。
作れる人に依頼するのも選択肢ですね。
Radianさんのおっしゃるクラスにビットマップを読み込んでおくという方法も気になりますし。
締め切りがあるわけではないので、また、時間が許せば向き合いたいと思います。ありがとうございます。。
回答2件
あなたの回答
tips
プレビュー