專案過大,在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,應該是最佳方案,但是程式還不會寫。 懇請前輩們再提供您的寶貴意見。 >>< face="Verdana, Arial, Helvetica"> 其實方案三的解決辦法,scotthsiao 已經說得很清楚了,ERP軟體勢必用到大量的Form,如果在程序運行時,把所有Form全部創建的話,當然會影響效率與耗用大量內存。所以你可以先把所有的Form之間的關係給理清楚(主要是依存關係),把運行時首先要用到的Form(如MainForm或DataModule)設置為自動創建,而其它還沒有用到的Form改為運行時由代碼創建,用完後還可以Free掉。 scotthsiao所講的設置Options就是這個實現。 你也可以打開Project文件.dpj, 例如.dpj內容包括:begin Application.Initialize; Application.CreateForm(TCDMD1, CDMD1); Application.CreateForm(TSDMD1, SDMD1); Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm4, Form4); Application.CreateForm(TForm5, Form5); Application.CreateForm(TForm8, Form8); Application.CreateForm(TForm10, Form10); Application.CreateForm(TForm15, Form15); Application.CreateForm(TForm13, Form13); Application.CreateForm(TForm11, Form11); Application.CreateForm(TForm7, Form7); Application.CreateForm(TForm6, Form6); Application.CreateForm(TForm14, Form14); Application.CreateForm(TForm12, Form12); Application.CreateForm(TForm16, Form16); Application.CreateForm(TForm9, Form9); Application.CreateForm(TForm18, Form18); Application.Run; end.如果開始運行時,衹需要CDMD1、SDMD1以及Form1,則可以把其它的都刪除: begin Application.Initialize; Application.CreateForm(TCDMD1, CDMD1); Application.CreateForm(TSDMD1, SDMD1); Application.CreateForm(TForm1, Form1); Application.Run; end.[/code] 當要用到Form2時,比如在Form1的Button1上點擊: procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); Form2.Show; ...... end; ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
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. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |