4

重量のある Windows インターフェイスを構築するときに、ユーザー オブジェクト ハンドルの制限に対処するための高度な戦略を探しています。SWT またはダイレクト Windows GUI API を使用して、この問題をどのように克服または回避したかを説明してください。私が興味を持っていない唯一のことは、ウィジェットの使用を最適化するための戦略です.

私の状況:
同じ親シェル内で複数のセッションを可能にする SWT ベースの GUI があり、各セッション内では、ユーザーが生成したコメントのリストが表示される 3 つの別々の場所があります。ユーザーが複数のセッションを開き、それらのリストに入力するデータを取得すると、コメントの数に応じて、ユーザー オブジェクト ハンドルの数が劇的に増加する可能性があります。

私の現在の解決策:
1. デフォルトでコメントをページングすることで、各セッションのコメント行の数を制限していますが、管理上の要求により、これを完全にバイパスする効果的な [すべて表示] ボタンもあります。
2. 各行に編集不可のすべての情報をカスタム描画します。これは、各行が 2 つのオブジェクト ハンドルのみを使用することを意味します。
3. 現在の使用状況と最大使用状況について OS に問い合わせる JNI 呼び出しを作成しました。これにより、クラッシュが差し迫っていることをユーザーに知らせることができます。言うまでもなく、彼らはこの警告を無視します。

4

3 に答える 3

6

まず、問題はデスクトップ ヒープとハンドル数ではないですか? 各ハンドルは、一定量の Windows デスクトップ ヒープを消費できます。1 つの USER ハンドルが多くのスペースを消費する場合もあれば、ごくわずかなスペースを消費する場合もあります。これは、実際には別のものである場合に、ユーザー ハンドル数を追跡していないことを確認するために提案しています。(Microsoft の dheapmon ツールについては google を参照してください。役立つ場合があります)

レジストリのキーを変更することで、ハンドルの最大値を変更できることを読みました。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\Windows\ USERProcessHandleQuotaおよびGDIProcessHandleQuota

これは、ユーザーにとって短期的な修正になる可能性があります。

私はまず、アイテムごとに 2 つのユーザー ハンドルを維持する必要があることを把握することからアプローチします (リストボックス内のアイテムごとに 2 つのように?)。これは疑わしいようです。ユーザー ハンドルは、いくつかの最上位の Windows UI オブジェクト (Windows、メニュー、カーソル、ウィンドウの位置、アイコンなど) 用です。ウィジェットがアイテムごとに 2 つのオブジェクトを保持する必要がある理由がわかりません (アイコン ハンドルですか??)。

すべてをバラバラに引き裂こうとしている場合、これは仮想モードのリスト ビュー(LVS_OWNERDATA) の仕事のように思えます。

于 2008-10-03T12:58:16.527 に答える
5

ウィンドウレス コントロールの使用を検討する必要があります。それらはまさにこの状況のた​​めに設計されています。Raymond Chen による「ウィンドウレス コントロールは魔法ではない」を参照してください。

于 2008-10-02T22:15:17.613 に答える
2

トップレベルのウィンドウだけでなく、ほとんどのネイティブコントロールはそれぞれ1つのユーザーオブジェクトを使用します。ユーザーおよびその他のハンドルタイプの詳細な説明については、「ハンドルを指定してください。オブジェクトを表示します」を参照してください。これは、コンポジットの場合でも、SWTがウィジェットごとに少なくとも1つのユーザーハンドルを使用することも意味します。

プロセスあたり10000ユーザーオブジェクトの制限に本当に達していて、リークがない場合、唯一のオプションは、アプリケーション内のウィジェットインスタンスの数を減らすことです。アプリケーションでこれをどのように行ったかについてのブログ記事を書きました。

于 2011-12-02T11:46:48.293 に答える