none
VB6專案愈來愈大了尋求減肥方法 RRS feed

  • 問題

  • 我有個VB6專案, 有304個表單, 編譯後執行檔約30MBytes,
    執行時佔用記憶體約60MBytes,且遲續增加表單中,
    我發現每增加一個表單,記憶體佔用量就增加一些,
    看來VB6它是把所有表單都載入了,不是要用時才載入!
    想請問有什麼方法或技術可以讓我的專案減肥,
    我要減的是 "執行時佔用主記憶體量", 不是執行檔的大小!
    因為我的系統使用的電腦記憶體大都是128M,256M或512M而已,
    現在發現記憶體剩餘空間愈來愈少了,已經只剩幾十M,有時會幾M而已!




    Jones
    2009年10月30日 上午 07:42

解答

  • Hi,

    你應該從程式的邏輯與架構下手

    檢查一下
    那304個表單是否是必要的
    建立的物件是否都是必要的
    是否有能重複利用物件的寫法
    物件的生命週期是否太長

    也可以邊運行邊看系統管理員或是效能監視器
    找出做哪個動作時記憶體會暴增

    thx

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2009年10月30日 上午 08:56
  • 把報表表單另外做成執行檔,從主表單呼叫執行,用完就結束,這樣可行嗎...
    2009年10月30日 上午 09:35
  • HI,


    VB6開發的是Windows應用程式, Windows應用程式載入時會載入執行時需要用到的所有DLL, 所以您的程式切成DLL來載入應該是沒有幫助的.

    VB.NET開發的是.NET程式, .NET程式會在需要用到DLL時才載入DLL, 所以根本的解決方式是用VB.NET來開發, 不過改寫程式是很難下決定的事情
    2009年10月31日 上午 06:41
  • 同一程式只能開啟一份,一般是用:
    App.PrevInstance
    處理吧?

    我 VB6 已經沒在安裝了,不過我記得線上手冊的最佳化一節有討論到:

    大小最佳化

    過去在設計應用程式時,經常會受到可用的記憶體和系統資源的限制。在 32 位元作業系統下,如 Windows 95 和 Windows NT,大多數 Visual Basic 程式設計者就很少需要考慮到這些因素。雖然如此,關於一些應用程式做最小化處理的情況,仍然是很重要的。

    有些應用程式需要從 Internet 下載或透過電子郵件的附件型態傳輸,它們的大小就顯得十分重要。有些連線上的資料傳輸速率不夠快,傳輸 1MB 的檔案可能要花上 1 小時或更多的時間。另外,許多應用程式除了 .exe 檔之外,還需要其他的 .dll 或 .ocx 檔案,這就更增加了下載程式的大小 (和時間)。像這些情況,您就需要將磁碟中應用程式的大小做最佳化處理。

    即使使用者並不想下載您的應用程式,但是您還是應該讓應用程式儘可能的精簡。較小的應用程式載入速度快,是因為佔用記憶體少,還可同時執行其它的程式。所以,通常您可透過減少所佔的記憶體空間,來做最佳化處理,以提高應用程式的執行效能。

     有關大小最佳化的進一步說明,請參閱以下的章節:


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月31日 下午 02:03

所有回覆

  • Hi,

    你應該從程式的邏輯與架構下手

    檢查一下
    那304個表單是否是必要的
    建立的物件是否都是必要的
    是否有能重複利用物件的寫法
    物件的生命週期是否太長

    也可以邊運行邊看系統管理員或是效能監視器
    找出做哪個動作時記憶體會暴增

    thx

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2009年10月30日 上午 08:56
  • 表單304個,雖然不是每個客人都會用到(我的系統是套裝軟體),但每個都不能少,
    記憶體使用量並不會暴增,都維持在60M~70M之間!
    我的表單中大約有100個是報表表單,我在想有什麼方法可以讓這100個表單,
    在程式執行時不要載入佔記憶體,等到要用到某張表單時再载入,用完就釋放!

    Jones
    2009年10月30日 上午 09:25
  • 把報表表單另外做成執行檔,從主表單呼叫執行,用完就結束,這樣可行嗎...
    2009年10月30日 上午 09:35
  • 有考慮過這樣做,但因為我程式有分單機網路版,使用Access資料庫,單機版時以獨佔模式開啟資料庫,
    因此,再呼叫報表表單來執行時就無法同時開啟資料庫了!
    我再想:有沒有什麼方法可以將現在開啟的資料庫連線,傳給外部EXE檔使用,這樣就可以解決我的問題了!


    Jones
    2009年10月31日 上午 02:52
  • 要把ADODB connection傳給執行檔?主程式先把連線關閉,再把連線字串和SQL字串傳給報表執行檔,開啟資料庫,報表執行檔結束關閉連線,回主程式開啟資料庫,這樣可行嗎...
    2009年10月31日 上午 03:51
  • HI,


    VB6開發的是Windows應用程式, Windows應用程式載入時會載入執行時需要用到的所有DLL, 所以您的程式切成DLL來載入應該是沒有幫助的.

    VB.NET開發的是.NET程式, .NET程式會在需要用到DLL時才載入DLL, 所以根本的解決方式是用VB.NET來開發, 不過改寫程式是很難下決定的事情
    2009年10月31日 上午 06:41
  • 那為什麼要以獨佔模式來開 Access ?
    基於行程獨立,你不可能把行程內的 handle 傳給其他程式,所以問題回到你幹嘛獨佔?


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月31日 上午 09:45
  • To: tihs: 用.NET改寫也曾想過,但工程太過耗大,而且歷史包袱甚大,因為這個專案已經開發約十年了,使用中的客戶有數百家了,
    程式改寫對舊客戶要更新是件麻煩的大事,而且客人的電腦等級都很低,用.NET程式不會比VB6快(個人認為)!

    Jones
    2009年10月31日 下午 12:42
  • To:心冷熱情熄 : 因為要限制為單人使用(同時間只能開啟一份程式)所以才獨佔模式開啟資料庫!


    Jones
    2009年10月31日 下午 12:44
  • To: Joe Hung: 如果沒有更好的方法,或許就會使用這個方式來做做看!

    Jones
    2009年10月31日 下午 12:46
  • 同一程式只能開啟一份,一般是用:
    App.PrevInstance
    處理吧?

    我 VB6 已經沒在安裝了,不過我記得線上手冊的最佳化一節有討論到:

    大小最佳化

    過去在設計應用程式時,經常會受到可用的記憶體和系統資源的限制。在 32 位元作業系統下,如 Windows 95 和 Windows NT,大多數 Visual Basic 程式設計者就很少需要考慮到這些因素。雖然如此,關於一些應用程式做最小化處理的情況,仍然是很重要的。

    有些應用程式需要從 Internet 下載或透過電子郵件的附件型態傳輸,它們的大小就顯得十分重要。有些連線上的資料傳輸速率不夠快,傳輸 1MB 的檔案可能要花上 1 小時或更多的時間。另外,許多應用程式除了 .exe 檔之外,還需要其他的 .dll 或 .ocx 檔案,這就更增加了下載程式的大小 (和時間)。像這些情況,您就需要將磁碟中應用程式的大小做最佳化處理。

    即使使用者並不想下載您的應用程式,但是您還是應該讓應用程式儘可能的精簡。較小的應用程式載入速度快,是因為佔用記憶體少,還可同時執行其它的程式。所以,通常您可透過減少所佔的記憶體空間,來做最佳化處理,以提高應用程式的執行效能。

     有關大小最佳化的進一步說明,請參閱以下的章節:


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月31日 下午 02:03
  • 另外,VB6 已經是 11 年前的編譯器了,回顧 11 年前,網際網路發展有限,很多功能已不是現在的想法或邏輯能適應,也已經遠離現在環境的需求,若是有經常性業務需求,應考慮升級。

    若要垂死掙扎,有些觀念還是可以用進去的,比如說 ADO.NET 的離線存取,在 ADO 存取完即關閉連線,就是其中之一,我在 2002 時在 VB6 中就養成習慣,存取完立即關閉連線,我當時是先建立中間類別,舊程式碼改呼叫中間類別,還沒改到的不管,讓舊的程式碼逐步完成轉型,再由中間類別處理連線事宜,升級到 VBNET 時,改寫中間類別,而原先的要求端就沒太大變化,直接可用,這是我當時轉型升級的過程。

    至於效能部分,若是你有大量使用到類別模組,VBNET 這部分改善很多,至少有四倍以上的差異。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月31日 下午 02:12
  • 我是要防止由不同電腦連進來開啟同一個資料庫,所以才使用獨佔式開啟資料庫,無法使用App.PrevInstance!



    Jones
    2009年11月1日 上午 07:12
  • 我有個VB6專案, 有304個表單, 編譯後執行檔約30MBytes,
    執行時佔用記憶體約60MBytes,且遲續增加表單中,
    我發現每增加一個表單,記憶體佔用量就增加一些,
    看來VB6它是把所有表單都載入了,不是要用時才載入!
    想請問有什麼方法或技術可以讓我的專案減肥,
    我要減的是 "執行時佔用主記憶體量", 不是執行檔的大小!
    因為我的系統使用的電腦記憶體大都是128M,256M或512M而已,
    現在發現記憶體剩餘空間愈來愈少了,已經只剩幾十M,有時會幾M而已!




    Jones

    表單關閉時,是呈現HIDE的狀態還是完全Unload Form掉?
    若要降低執行檔大小,可使用壓縮殼,如RLPack、UPX等。
    但這是最消極的作法
    很抱歉.. 各位大大,我是個新手,如有敘述不清請不吝指教!
    2009年11月2日 下午 12:49
  • 表單關閉都是用Unload Me,我程式一進入只開啟一個主表單就佔用主記憶60M了,
    我要減的是 "執行時佔用主記憶體量", 不是執行檔的大小!
    我目前就已經使用AsPack去壓縮執行檔了!
    Jones
    2009年11月2日 下午 02:01