全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1151
推到 Plurk!
推到 Facebook!

專案過大,在Window98開啟時出現記憶體不足的訊息

尚未結案
hsienche
一般會員


發表:6
回覆:9
積分:3
註冊:2003-08-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-18 09:52:57 IP:203.204.xxx.xxx 未訂閱
各位前輩安安: 小弟使用Delphi 7幫公司開發ERP軟體,剛開始一切都很順利,隨著專案愈來愈龐大(改架構已經是不可能了),昨日在98系統開專案程式時,出現記憶體不足,請關閉部份應用程式的訊息,但在2000與XP的系統沒有此問題產生。 小弟發現所有98的電腦全都有此狀況,但把部份程式從專案Project移除後,98系統開啟程式又正常了,因為專案已經很大了,改架構幾乎是不可能了,因公司有些舊程式一定要在98系統才可以執行,所以也無法立即更新至2000或XP系統。 請問前輩們,有沒有方法幫幫小弟解決此問題,萬分的感激!
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-18 10:24:53 IP:222.248.xxx.xxx 未訂閱
更換作業系統或昇級計算機硬件 ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
scotthsiao
高階會員


發表:13
回覆:324
積分:147
註冊:2005-02-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-18 10:26:09 IP:210.66.xxx.xxx 未訂閱
建議您把不用的 Form 不要先開啟,等到使用時再載入。 Form 使用完畢,立即關閉且清空。 從 Project -> Options->Form 中移動非必要之form 至 Available forms 即可 通常在 Auto-create forms 只保留 MainForm 及 DataModule 發表人 - scotthsiao 於 2005/10/18 10:34:42
hsienche
一般會員


發表:6
回覆:9
積分:3
註冊:2003-08-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-18 10:34:25 IP:163.17.xxx.xxx 未訂閱
給 h@visli 前輩:      1.目前使用最新的硬體K8系統,記憶體512,只要是98系統仍有此問題。   2.舊程式未轉換之前,短期內無法將98系統升級    給 scotthsiao 前輩:      目前我的專案即是採用您所說的方法,但98系統仍有此問題。    謝謝前輩們的指導。
scotthsiao
高階會員


發表:13
回覆:324
積分:147
註冊:2005-02-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-18 10:48:52 IP:210.66.xxx.xxx 未訂閱
請問出現錯誤是在一開始執行,或是執行一半 ? 如果是執行一半才出現,就可能是沒清空舊的 form ,沒釋放記憶空間。
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-18 10:50:34 IP:222.248.xxx.xxx 未訂閱
把虛擬內存改大些試試看有沒有效果? 不過最好還是在自己的程式上下功夫,因為看你說的硬體配置也不算差啊。 ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
hsienche
一般會員


發表:6
回覆:9
積分:3
註冊:2003-08-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-18 10:59:49 IP:163.17.xxx.xxx 未訂閱
引言: 請問出現錯誤是在一開始執行,或是執行一半 ? 如果是執行一半才出現,就可能是沒清空舊的 form ,沒釋放記憶空間。
您好,98系統一開始執行程式就出現此問題
hsienche
一般會員


發表:6
回覆:9
積分:3
註冊:2003-08-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-18 11:02:05 IP:163.17.xxx.xxx 未訂閱
引言: 把虛擬內存改大些試試看有沒有效果? 不過最好還是在自己的程式上下功夫,因為看你說的硬體配置也不算差啊。 ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
您所提的方法,我也有試過,但還是一樣耶
hsienche
一般會員


發表:6
回覆:9
積分:3
註冊:2003-08-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-18 11:15:05 IP:163.17.xxx.xxx 未訂閱
各位前輩安安:      小弟經與同事討論後,發現可能的原因如下:      問題應該出現在主程式的Menu架構,因主程式一開啟時,即將所有會用到相關Form Use 進來,然後在MenuItem OnClick 事件觸發時開起Form,因為一開始Use太多的Form,造成記憶體不足。      解決方案一:將Form改成dll,但因系統使用太多全域變數,改寫需耗用很多時間。      解決方案二:將專案切割成多個小專案,很笨的方法,但好像最簡單。      解決方案三:主程式一開啟時不用Use所有的Form,待MenuItem OnClick 事件觸發時再Use所需要的Form,應該是最佳方案,但是程式還不會寫。    懇請前輩們再提供您的寶貴意見。
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-18 13:40:24 IP:218.163.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-18 14:08:13 IP:222.248.xxx.xxx 未訂閱
引言: 各位前輩安安: 小弟經與同事討論後,發現可能的原因如下: 問題應該出現在主程式的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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-18 17:29:16 IP:163.17.xxx.xxx 未訂閱
感謝各位前輩先進的指導, 但現在發現,只要把太多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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-10-18 19:58:22 IP:222.95.xxx.xxx 未訂閱
這並不是記憶體被用完了,而是在 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/
系統時間:2024-05-12 18:42:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!