私は、カスタム(かなり優れた堅牢な)フレームワークが提供されている大規模なプロジェクトに取り組んでおり、フォームとビューを表示するためにそれを使用する必要があります。
新しいStrategyFormが開かれるたびにインスタンス化される抽象クラスStrategyEditor(フレームワークのあるクラスから派生)があります。
StrategyForm
(カスタマイズされたウィンドウフレーム)にはが含まれますStrategyEditor
。
StrategyEditor
が含まれていますStrategyTab
。
StrategyTab
が含まれていますStrategyCanvas
。
これは、実行時に1つのStrategyFormオブジェクトがメモリに割り当てられた場合に作成されるオブジェクトが多数あることを明確にするために、大きなクラスのごく一部です。StrategyForm
私のコンポーネントは、コードが私の制御下にない場合を除いて、上記のすべてのクラスを所有しています。
これで、実行時に、ユーザーは多くのストラテジーオブジェクトを開きます(これにより、新しいStrategyFormオブジェクトの作成がトリガーされます)。44の戦略オブジェクトを見ると、アプリケーションによって作成されたUSER OBJECT HANDLES(これ以降はUOHを使用します)は約20k以上に達しますが、レジストリでは、ハンドルのデフォルトの量は10kです。ユーザーオブジェクトについて詳しくは、こちらをご覧ください。さまざまなマシンでテストしたところ、メッセージをポップアップするために開かれる戦略オブジェクトの数が異なることが明らかになりました。あるm / cでは44の場合、別のm/cでは40になる可能性があります。
メッセージのポップアップが表示されたら、アプリケーションの応答が遅いことを意味します。オブジェクトが少なくなると悪化し、ウィンドウフレームとそれに続くオブジェクトの作成は失敗します。
私たちは最初、それは十分なメモリの問題ではないと考えました。しかし、C#で詳細を読むnew
と、アプリのメモリが不足すると例外がスローされることを理解するのに役立ちました。これはメモリの問題ではない、と私は感じています(タスクマネージャも1.5GB以上の使用可能なメモリを示しました)。
M/C仕様
Core2Duo 2GHz +
4GB RAM
80GB +ページファイル用の空きディスク容量
仮想メモリセット:4000-6000
私の質問
Q1。これはメモリの問題のように見えますが、そうではないのは間違っていますか?
Q2。これは、(私が考えているように)無料のUOHの枯渇を示しており、ウィンドウハンドルの作成に失敗する結果になっていますか?
Q3。オブジェクトのロードを回避するにはどうすればよいですかStrategyEditor
(しきい値を超えて、UOHの現在の使用状況を監視します)。(使用中のUOHの数を取得する方法はすでにわかっているので、そこには行かないでください。)への呼び出しnew StrategyForm()
はコンポーネントの制御外であることに注意してください。
Q4。私は少し混乱しています-ユーザーオブジェクトへのハンドルとは正確には何ですか?MSDNは、私たちが作成するオブジェクトについて話しているのですか、それともウィンドウハンドル、カーソルハンドル、アイコンハンドルなどの特定のオブジェクトについて話しているのですか?
Q5。UOHを使い果たす原因は何ですか?(Q4とほぼ同じ)
知識豊富な回答をいただければ幸いです。どうもありがとう!:)
[更新]
Stakxの回答に基づいて、開いているウィンドウはユーザーのみが閉じることに注意してください。これは、あまりにも多くの子ウィンドウが開かれるMDIアプリの状況の一種です。だから、Dispose
いつでも呼び出すことはできません。