2010-09-19 23 views
4

我使用德爾福2010年 我必須設置UseLatestCommonDialogs爲False ,另外設置開放式的ofOldStyleDialog財產和保存對話框爲true 如果我想的是打開和保存對話框作品在Windows 7 (否則它們根本不打開)。 這也是事實,我保留了相當多的空間用於堆:問題與Windows下的開放式保存對話框7

{$M 16384, 60048576} 

,因爲我用的大型數據集遞歸算法。 現在我不知道是什麼問題:

  1. 新的對話顯得很佔用空間,有時 他們在一開始和一組開放後的工作和保存 對話框中執行它不會打開對話框更多 (也許對話框在執行後不釋放內存?)

  2. 在Windows 7中是否存在缺陷?

其他人遇到過類似的問題?

在Windows 7上使用古老的對話框 (它們甚至比XP風格更老,我認爲它們看起來像在Windows NT中)看起來有點奇怪。

任何建議將不勝感激。

在此先感謝。

回答

13

$M指定的缺省堆棧空間分配對進程中所有線程都是全局的,它們沒有指定它們自己的特定需求。 60M對此非常重要,遠遠超過幾乎所有的堆棧。

文件對話框本質上是Windows資源管理器的託管版本。它們會將縮略圖,列處理程序,上下文菜單等外殼程序加載到您的進程中。隨着Windows越來越多地出現,MS和第三方都可以隨意使用越來越多的資源(包括線程)來異步添加更多信息,而不會阻塞用戶界面。在Windows 7 64位機器上使用notepad.exe進行的簡單測試顯示,它在對話框前有1個線程,但在對話框打開時有19個線程。在默認堆棧預留接近60M的32位進程中,默認情況下,這需要保留超過1G或超過32位應用程序可訪問的總地址空間的一半。如果應用程序中有很多數據正在處理,那麼通過內存碎片很容易看到地址空間用完了--EXE,系統DLL等的所有代碼都需要在某個地方適合。默認堆棧預留60M太高而無法正常工作。

您是否考慮過在您創建的線程中移動深度遞歸計算?不過,您需要直接使用System中的BeginThread(),以明確指定堆棧預留。

另外,是否有可能嘗試減少算法的堆棧使用情況?如果您在堆棧中分配記錄或數組,請考慮動態分配它們。如果你有一個函數(大量嵌套)並且有很多局部變量,可以考慮創建一個包含局部變量並動態分配的記錄。如果你依賴於遞歸順序工作(例如深度優先遍歷樹/圖),考慮使用遞歸來簡單地對工作進行排序(例如,將節點添加到列表),並反覆進行實際處理。如果需要的話,可以看看重做算法以使用明確的堆棧。具有顯式堆棧的另一個優點是,如果堆棧和隊列實現使用多態接口,則可以在需要時輕鬆切換到寬度優先,使用隊列而不是堆棧,單線程。

0

感謝你非常接近:

「如果你依賴於遞歸序列工作(株/圖表例如深度優先遍歷),考慮使用遞歸只是順序的工作(如添加節點到一個列表),並且迭代地進行真正的處理。「

是的,我用它來計算強連通圖的組件。 我正在使用算法的變體:http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm

而我不明白怎麼做沒有遞歸。 你有什麼建議 - 或指向一個非遞歸算法的深度 首次在圖上搜索?

最好。

+0

這不是*問題的答案*,而是*凱利的回答*評論* – 2010-09-19 16:47:46

+1

我建議你就這個問題提出一個單獨的問題我想刪除這個答案 – 2010-09-19 20:02:25

+0

其實,@Barry,他們*可以*評論他們自己的問題和答案,以及他人問題的答案 – 2010-09-20 02:43:06

0

再次感謝這非常確切的答案。

我再次測試並得到了相同的結果,你寫道: 其實可以當出現內存問題進行預測:

  1. 我是在2010年德爾福檢查「胎面狀態」:當使用 舊對話框在打開/保存對話框 打開時出現新的花紋,並在關閉時從列表中刪除。 使用新對話框執行此操作時,打開/保存對話框會產生6 執行後未被刪除的線程, 以及有趣的內容:當向FileName輸入某些內容時 (未從可用文件列表中選擇文件鼠標點擊) 三個新的主題出現,並呆在那裏,所以已經有 完全「沒有必要」 9線程

  2. 然後看在Windows任務管理器,你可以看到,當: 「線程數」 * 「在我的應用程序中定義的堆棧」> 「可用物理內存」+「系統緩存」 程序將報告內存問題。

因此,與大約10個線程的時刻打開,一大堆當然 的有問題。 我正在檢查只在XP上,但在Windows 7上,我猜, 生成的線程數量更大?

而且有沒有辦法以某種方式殺死這個線程?

再次感謝和所有最好的。

「文件對話框本質上是Windows資源管理器的託管版本,它們會將外殼程序加載到您的進程中,如縮略圖,列處理程序,上下文菜單等等。隨着Windows的增長更多,MS和第三方免費使用越來越多的資源(包括線程),以異步方式添加更多信息,而不會阻塞用戶界面。使用記事本進行簡單測試。exe在我的Windows 7 64位機器上顯示它在對話框之前有1個線程,但在對話框打開時有19個線程。在默認堆棧預留接近60M的32位進程中,默認情況下,這需要保留超過1G或超過32位應用程序可訪問的總地址空間的一半。如果在應用程序中有很多數據正在處理,「