主程式需要呼叫一個模塊,但在主程式中來加載這個模塊會消耗大量的記憶體,并且這個模塊不是必需的,偶爾會用到。
現在有兩種方法:一種是把模塊的代碼直接寫到主程式代碼中,這樣會占用大量主程式記憶體。
另一種方法:把子模塊做成另一個exe讓主程式來啟動它,然后通過共享記憶體實作互動。
請教一下第二種方法通常是怎么做?是讓主程式啟動模塊程式,還是直接把這個啟動模塊做成服務開機啟動。
uj5u.com熱心網友回復:
偶爾用到的 可以顯式加載, 用完了后釋放
// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from Myputs.dll.
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *MYPROC)(LPWSTR);
VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
hinstLib = LoadLibrary(TEXT("myputs"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");
// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
}
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
}
uj5u.com熱心網友回復:

如果記憶體管理技術不精通,就考慮exe,用完就kill.不長期占用記憶體。
然后是exe傳參問題。一般都是入口傳。資料輸出看需要哪種方便就怎么搞。
uj5u.com熱心網友回復:
你這個是動態加載dll,也是會增當前行程的記憶體的
uj5u.com熱心網友回復:
這個DLL究竟會導致你的記憶體增加多少 會導致加載之后程式崩潰嗎?
如果是這樣,那么你另外開一個行程也會有這樣的危險,畢竟從你的表述看,占用巨量記憶體的是這個模塊,你單獨放在一個exe中,整體的記憶體消耗不會減少(開行程很可能會比加載一個dll消耗更多一些) 如果你真的是受限于記憶體使用量,應該考慮利用系統的虛擬記憶體機制或者自己顯式把一些運行中用到的資料遷移到磁盤、資料庫(也會利用磁盤) 或是把模塊放到另一臺機器去跑,比如做成DCOM、COM+組件或者別的可以RPC呼叫的模塊 再通過網路去呼叫它
uj5u.com熱心網友回復:
偶爾用到的 可以顯式加載, 用完了后釋放
// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from Myputs.dll.
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *MYPROC)(LPWSTR);
VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
hinstLib = LoadLibrary(TEXT("myputs"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");
// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
}
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
}
你這個是動態加載dll,也是會增當前行程的記憶體的
這個DLL究竟會導致你的記憶體增加多少 會導致加載之后程式崩潰嗎?
如果是這樣,那么你另外開一個行程也會有這樣的危險,畢竟從你的表述看,占用巨量記憶體的是這個模塊,你單獨放在一個exe中,整體的記憶體消耗不會減少(開行程很可能會比加載一個dll消耗更多一些) 如果你真的是受限于記憶體使用量,應該考慮利用系統的虛擬記憶體機制或者自己顯式把一些運行中用到的資料遷移到磁盤、資料庫(也會利用磁盤) 或是把模塊放到另一臺機器去跑,比如做成DCOM、COM+組件或者別的可以RPC呼叫的模塊 再通過網路去呼叫它
這個模塊大概占1個G的記憶體,我的想法是每個行程有3GB的用戶區記憶體,如果把這1個G加載到主程式中那么主程式就只有2個G記憶體可以用(目前情況是主程式2個G不夠用),我就想把這個模塊做成一個單獨的行程,這樣的話就影響不到主程式的記憶體占用了,不知道我這樣的想法是不是正確的?
uj5u.com熱心網友回復:
神啊,1G記憶體占用,僅僅是子模塊,現在的軟體都這樣流氓嗎。另一種方法:把子模塊做成另一個exe讓主程式來啟動它,然后通過共享記憶體實作互動。
主程式啟動操作可能比較方便,原則就是,不用的時候子模塊要釋放記憶體。
uj5u.com熱心網友回復:
神啊,1G記憶體占用,僅僅是子模塊,現在的軟體都這樣流氓嗎。
另一種方法:把子模塊做成另一個exe讓主程式來啟動它,然后通過共享記憶體實作互動。
主程式啟動操作可能比較方便,原則就是,不用的時候子模塊要釋放記憶體。
哈哈,這個是一個AI模塊,要加載許多AI模型,確實很大!目前是和主程式放一起的,后面模型再多應該做單獨做到一個服務器上
uj5u.com熱心網友回復:
主程式2G都不夠用,加載的模塊有1G大小,需要這么多虛擬記憶體,怎么不考慮編譯成x64程式,64位Windows下單個行程的虛擬記憶體可以到128TB,夠了嗎?uj5u.com熱心網友回復:
偶爾用到的 可以顯式加載, 用完了后釋放
// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from Myputs.dll.
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *MYPROC)(LPWSTR);
VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
hinstLib = LoadLibrary(TEXT("myputs"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");
// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
}
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
}
你這個是動態加載dll,也是會增當前行程的記憶體的
這個DLL究竟會導致你的記憶體增加多少 會導致加載之后程式崩潰嗎?
如果是這樣,那么你另外開一個行程也會有這樣的危險,畢竟從你的表述看,占用巨量記憶體的是這個模塊,你單獨放在一個exe中,整體的記憶體消耗不會減少(開行程很可能會比加載一個dll消耗更多一些) 如果你真的是受限于記憶體使用量,應該考慮利用系統的虛擬記憶體機制或者自己顯式把一些運行中用到的資料遷移到磁盤、資料庫(也會利用磁盤) 或是把模塊放到另一臺機器去跑,比如做成DCOM、COM+組件或者別的可以RPC呼叫的模塊 再通過網路去呼叫它
這個模塊大概占1個G的記憶體,我的想法是每個行程有3GB的用戶區記憶體,如果把這1個G加載到主程式中那么主程式就只有2個G記憶體可以用(目前情況是主程式2個G不夠用),我就想把這個模塊做成一個單獨的行程,這樣的話就影響不到主程式的記憶體占用了,不知道我這樣的想法是不是正確的?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/8957.html
標籤:進程/線程/DLL
下一篇:VS2010國際化問題
