專案過大,在Window98開啟時出現記憶體不足的訊息 |
尚未結案
|
hsienche
一般會員 ![]() ![]() 發表:6 回覆:9 積分:3 註冊:2003-08-28 發送簡訊給我 |
各位前輩安安: 小弟使用Delphi 7幫公司開發ERP軟體,剛開始一切都很順利,隨著專案愈來愈龐大(改架構已經是不可能了),昨日在98系統開專案程式時,出現記憶體不足,請關閉部份應用程式的訊息,但在2000與XP的系統沒有此問題產生。 小弟發現所有98的電腦全都有此狀況,但把部份程式從專案Project移除後,98系統開啟程式又正常了,因為專案已經很大了,改架構幾乎是不可能了,因公司有些舊程式一定要在98系統才可以執行,所以也無法立即更新至2000或XP系統。 請問前輩們,有沒有方法幫幫小弟解決此問題,萬分的感激!
|
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
|
scotthsiao
高階會員 ![]() ![]() ![]() ![]() 發表:13 回覆:324 積分:147 註冊:2005-02-01 發送簡訊給我 |
|
hsienche
一般會員 ![]() ![]() 發表:6 回覆:9 積分:3 註冊:2003-08-28 發送簡訊給我 |
|
scotthsiao
高階會員 ![]() ![]() ![]() ![]() 發表:13 回覆:324 積分:147 註冊:2005-02-01 發送簡訊給我 |
|
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
|
hsienche
一般會員 ![]() ![]() 發表:6 回覆:9 積分:3 註冊:2003-08-28 發送簡訊給我 |
|
hsienche
一般會員 ![]() ![]() 發表:6 回覆:9 積分:3 註冊:2003-08-28 發送簡訊給我 |
|
hsienche
一般會員 ![]() ![]() 發表:6 回覆:9 積分:3 註冊:2003-08-28 發送簡訊給我 |
各位前輩安安: 小弟經與同事討論後,發現可能的原因如下: 問題應該出現在主程式的Menu架構,因主程式一開啟時,即將所有會用到相關Form Use 進來,然後在MenuItem OnClick 事件觸發時開起Form,因為一開始Use太多的Form,造成記憶體不足。 解決方案一:將Form改成dll,但因系統使用太多全域變數,改寫需耗用很多時間。 解決方案二:將專案切割成多個小專案,很笨的方法,但好像最簡單。 解決方案三:主程式一開啟時不用Use所有的Form,待MenuItem OnClick 事件觸發時再Use所需要的Form,應該是最佳方案,但是程式還不會寫。 懇請前輩們再提供您的寶貴意見。
|
pgdennis
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
1.可在Form所在的Unit的initialization區段加上
initialization
RegisterClass(TFmxxx); 2.在Mainform(不用use任何Form Unit),先用FindClass找傳入的字串之FormClass
TFormClass(findclass('TFmxxx'));//傳回TFormClass 3.根據傳回之FormClass動態Create該form
function CreateChild(c:TFormClass); var f:TForm; begin Application.Createform(c,f); if Application.mainform.FormStyle = fsMDIForm then begin f.FormStyle:=fsMDIChild; f.position:=poDesigned; if not (f.WindowState=wsMaximized) then begin f.top:=0; f.left:=0; end; end; end;參考http://delphi.ktop.com.tw/topic.php?topic_id=19627
------
星期一,二...無窮迴圈@@ |
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 各位前輩安安: 小弟經與同事討論後,發現可能的原因如下: 問題應該出現在主程式的Menu架構,因主程式一開啟時,即將所有會用到相關Form Use 進來,然後在MenuItem OnClick 事件觸發時開起Form,因為一開始Use太多的Form,造成記憶體不足。 解決方案一:將Form改成dll,但因系統使用太多全域變數,改寫需耗用很多時間。 解決方案二:將專案切割成多個小專案,很笨的方法,但好像最簡單。 解決方案三:主程式一開啟時不用Use所有的Form,待MenuItem OnClick 事件觸發時再Use所需要的Form,應該是最佳方案,但是程式還不會寫。 懇請前輩們再提供您的寶貴意見。
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
hsienche
一般會員 ![]() ![]() 發表:6 回覆:9 積分:3 註冊:2003-08-28 發送簡訊給我 |
感謝各位前輩先進的指導,
但現在發現,只要把太多Form加入Project,即會產生此問題,
無論是否有Use到,或CreateForm,
我目前的專案一啟動只有開啟一個Form,
其餘皆是動態產生的, begin
SetLanguage(1);
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end. 但在98系統還是有此問題,但 2000 與 XP 則都完全正常,
看來目前只有將Form存成bpl或dll的方式可以解決此問題,
或是將專案拆成多個小專案了。
|
sryang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
這並不是記憶體被用完了,而是在 Windows 98 的 "System resource" 被用完了
不管你的電腦裝了多少的記憶體,Windoows 98 的 System Resource 都是一定的大小,分別是:
16 bit User Heap,64KB
32 bit Windows Heap,2MB
32 bit User Menu Heap,2MB
16 bit GDI Heap,64KB
32 bit GDI,2MB
只要其中有一個被用完,程式就無法被載入
請注意,其中有 2 個僅僅只有 64KB 的 Heap
所以有些人說,雖然 Windows 98 不像 DOS 有 640KB 的限制,但是有 64KB 的限制,指的就是這 2 個 Heap 的大小 而 NT/2000/XP 的資源管理跟 98 不同,極少發生這樣的情況 所以,分割成幾個 bpl 是一個好方法,使用 bpl 的話,全域變數仍然可用
只要將這些全域變數都放在一個 bpl 中,然後讓使用全域變數的 bpl 來 "required" 就可以了 加油喔,喵~ 發表人 - sryang 於 2005/10/18 20:00:51
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |