2008-10-02 34 views
4

我正在尋找處理用戶對象句柄限制時構建重量級的Windows界面的高級策略。請解釋如何使用SWT或直接Windows GUI API克服或繞過此問題。我不感興趣的唯一方法是優化小部件使用的策略,因爲我已經廣泛地完成了這個任務,並且它不能解決問題,只會使它不太可能。克服Windows用戶對象句柄限制

我的情況:
我有一個SWT基於GUI,允許同一父外殼內的多個會話,每個會話內的是其中顯示的用戶生成的評論列表,3個獨立的地方。當用戶打開多個會話並提取填充這些列表的數據時,根據註釋的數量,用戶對象句柄的數量會顯着增加。

我目前的解決方案:
1.我頁默認的意見,從而限制每個會話註釋的行數,但由於管理的要求,我也有什麼實際上是一個「查看全部」按鈕繞過這個完全。
2.我自定義在每一行中繪製所有不可編輯的信息。這意味着每行僅使用2個對象句柄。
3.我創建了JNI調用,查詢OS的當前使用情況和最大使用情況。有了這個我可以告訴用戶即將發生崩潰。不用說,他們無視這個警告。

回答

5

您應該考慮使用無窗口控件。它們正是爲這種情況而設計的。請參閱"Windowless controls are not magic",Raymond Chen

+0

在我看來,他並沒有創造多個(1000年代)吃掉手柄的窗戶。這聽起來好像他的單個(或3個)窗戶每個「項目」都在吃2個手柄。 – Aardvark 2008-10-03 13:06:28

6

首先,您確定問題不是桌面堆與處理計數?每個句柄可以消耗一定量的Windows桌面堆。一個用戶手柄可能會佔用很多空間,有些則很少。我建議這樣做,以確保當它真的是別的東西時,不會追蹤用戶處理次數。 (谷歌微軟dheapmon工具,它可以幫助)

我讀過您可以通過更改註冊表項修改在手柄上的馬克塞斯:

HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows NT \ CURRENTVERSION \ WINDOWS \ USERProcessHandleQuotaGDIProcessHandleQuota

這可能是爲用戶提供短期修正。

我會首先找出需要爲每個項目維護2個用戶句柄(比如列表框中的每個項目都需要2個)。這似乎是可疑的。 User handles僅適用於幾個頂級Windows UI對象(Windows,菜單,光標,窗口位置,圖標等)。我不明白爲什麼你的小部件需要爲每個項目保留2個對象(它是一個圖標句柄?)。

如果你想撕開整個事情 - 這聽起來像一個virtual-mode List-View(LVS_OWNERDATA)的工作。

2

不僅是頂級窗口,而且大多數本機控件都使用一個用戶對象。有關用戶和其他句柄類型的深入說明,請參見Give Me a Handle, and I'll Show You an Object。這也意味着SWT至少爲每個小部件使用一個用戶句柄,即使對於Composite也是如此。

如果你真的在每個進程中達到10000個用戶對象的限制,並且你沒有泄漏,那麼你唯一的選擇就是減少應用程序中的小部件實例的數量。我寫了一個blog article關於我們如何爲我們的應用程序做到這一點。