2011-11-16 8 views
6

का उपयोग कर आभासी आकार को निर्धारित करना मेरे पास एक डेल्फी प्रोग्राम है और मैं देख रहा हूं कि यह प्रोग्राम लॉग फ़ाइल में अपना "आभासी आकार" कैसे प्रिंट कर सकता है, ताकि जब मैं बहुत अधिक स्मृति का उपयोग कर सकूं तो मैं देख सकता हूं। डेल्फी कोड का उपयोग करके मैं "आभासी आकार" कैसे निर्धारित कर सकता हूं?डेल्फी

"आभासी आकार" से मेरा मतलब है कि Process Explorer द्वारा प्रदर्शित मूल्य। यह मान सामान्य कार्य प्रबंधक द्वारा प्रदर्शित नहीं किया जा सकता है। यह सीधे प्रोग्राम का स्मृति उपयोग नहीं है बल्कि पता स्थान उपयोग है। Win32 पर एक प्रोग्राम 2 जीबी से अधिक पता स्थान का उपयोग नहीं कर सकता है।

पीएस: मैं डेल्फी 6 का उपयोग कर रहा हूं लेकिन अन्य संस्करणों के लिए कोड/जानकारी भी ठीक होनी चाहिए।

+0

64 बिट विंडोज़ पर, LARGEADDRESSAWARE के साथ, 32 बिट प्रक्रिया 4 जीबी वर्चुअल एड्रेस स्पेस का उपयोग कर सकती है। डी 6 पर आपको बोर्लैंड एमएम में बग के कारण यह काम करने के लिए एमएम (उदा। फास्टएमएम) स्विच करने की आवश्यकता है। –

उत्तर

10

इस post जो कैसे एक आभासी आकार C/C++ का उपयोग कर पाने के लिए के बारे में संकेत देता है के लिए धन्यवाद, मैं निम्नलिखित डेल्फी समारोह लिखने में सक्षम था:

Type 
    TMemoryStatusEx = packed record 
    dwLength: DWORD; 
    dwMemoryLoad: DWORD; 
    ullTotalPhys: Int64; 
    ullAvailPhys: Int64; 
    ullTotalPageFile: Int64; 
    ullAvailPageFile: Int64; 
    ullTotalVirtual: Int64; 
    ullAvailVirtual: Int64; 
    ullAvailExtendedVirtual: Int64; 
    end; 
    TGlobalMemoryStatusEx = function(var MSE: TMemoryStatusEx): LongBool; stdcall; 

function VirtualSizeUsage: Int64; 
var MSE: TMemoryStatusEx; 
    fnGlobalMemoryStatusEx: TGlobalMemoryStatusEx; 
begin 
    Result := 0; 
    @fnGlobalMemoryStatusEx := GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx'); 
    if Assigned(@fnGlobalMemoryStatusEx) then 
    begin 
    MSE.dwLength := SizeOf(MSE); 
    if fnGlobalMemoryStatusEx(MSE) then 
     Result := MSE.ullTotalVirtual-MSE.ullAvailVirtual; 
    end; 
end; 

यह (मेरे लिए अच्छा काम करता है लगता है डेल्फी 6 , विन XP)। GlobalMemoryStatusEx के बजाय GlobalMemoryStatus का उपयोग करके एक आसान समाधान हो सकता है लेकिन यह 2 जीबी से अधिक स्मृति वाले सिस्टम पर सही ढंग से काम नहीं करेगा।

+0

+1 ओह हाँ। अपनी प्रक्रिया के लिए, यह सबसे अच्छी विधि है। –

6

प्रोसेस एक्सप्लोरर seemsNtQueryInformation को फोन करके यह करने के लिए लेकिन यह भी प्रदर्शन डेटा का उपयोग करने के लिए, मेरा उत्तर here में GetProcessVirtualBytes देखना संभव है।

+0

+1 त्वरित उत्तर के लिए धन्यवाद। मैंने कोशिश नहीं की है क्योंकि इस दौरान मुझे ऐसा करने का एक और तरीका मिला, लेकिन ऐसा लगता है कि यह एक अच्छा समाधान है। – Name

+0

@ नाम स्वागत है, बाहरी प्रक्रियाओं से पूछताछ करते समय यह विधि केवल आवश्यक है। जैसा कि मैंने आपके अपने उत्तर में एक टिप्पणी में कहा था, अगर आप अपनी प्रक्रिया के बारे में जानकारी की तलाश में हैं तो आपका समाधान सबसे अच्छा है। –

1

और उन लोगों के लिए जो पहले से ही उत्कृष्ट Jedi Code Library पर निर्भर हैं, आप JclWin32 इकाई में उपरोक्त बताए गए परिभाषाएं पा सकते हैं।

आपको आवश्यक वास्तविक संख्या JclSysInfo इकाई में व्यक्तिगत कार्यों के रूप में भी विभाजित कर दी गई है। गणना करने के लिए बस GetTotalVirtualMemory() - GetFreeVirtualMemory() पर कॉल करें।

+0

आपके उत्तर के लिए धन्यवाद। – Name