2013-10-11 16 views
5

हम अपने विंडोज के लिए एक छोटे से परीक्षण सूट विकसित यूआई इंजन जो प्रदर्शन को मापने और स्मृति रिसाव का पता लगाने के लिए एक स्वचालित ढंग से परीक्षण मामलों चलाते समय के लिए अनुमति देता प्रतिपादन फॉर्म्स। अब हम हैंडल लीक के लिए भी जांच करना चाहते हैं। डेस्कटॉप प्लेटफार्म पर हम इस कोड का उपयोग कर सकते हैं:GDI की निर्धारित संख्या को संभालती है और उपयोगकर्ता वस्तुओं

[DllImport("User32")] 
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); 

using (var process = Process.GetCurrentProcess()) 
{ 
    var gdiHandles = GetGuiResources(process.Handle, 0); 
    var userHandles = GetGuiResources(process.Handle, 1); 
} 

यह विधि विंडोज मोबाइल में उपलब्ध नहीं प्रतीत होती है। विंडोज मोबाइल/सीई पर प्रोग्रामेटिक रूप से इन मानों को निर्धारित करने का कोई और तरीका है?

उत्तर

1

यह एक उत्तर से अधिक सुझाव है।

आपको आवश्यकता हो सकती है कि आपके सभी "हैंडल" विधियों को एक अलग वर्ग में रखा जाए (मेरे पास User32, coreDLL आदि नामक कक्षाएं हैं)।

उसके बाद, आप एक काउंटर हर बार एक संसाधन प्रयोग किया जाता है को बढ़ा सकते हैं या प्रत्येक नए संभाल आप एक निजी तौर पर प्रबंधित सूची में बनाने को जोड़ने से पहले आप पारित कि वापस संभाल कर सकते हैं।

अब, पहले अपनी परियोजना बंद कर देता है, सुनिश्चित करें कि आपके काउंटर वापस शून्य या अपनी सूची में हैंडल के सभी बंद हो जाती हैं करने के लिए है या नहीं।

Untested कोड - मैं VS2008 यहाँ इस समय नहीं है।

[DllImport("User32")] 
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); 

private static List<IntPtr> m_handles = new List<IntPtr>(); 

public static IntPtr[] GetGuiResources() { 
    using (var process = Process.GetCurrentProcess()) 
    { 
    var gdiHandles = GetGuiResources(process.Handle, 0); 
    m_handles.Add(gdiHandles); 
    var userHandles = GetGuiResources(process.Handle, 1); 
    m_handles.Add(userHandles); 
    } 
    return new IntPtr[] { m_handles[m_handles.Count - 2], m_handles[m_handles.Count - 1] }; 
} 

public static void Close() { 
    for (int i = m_handles.Count - 1; -1 < i; i--) { 
    var handle = m_handles[i]; 
    // release your handle 
    } 
} 

फिर, यह सिर्फ एक विचार है। मैंने पहले कभी यह मुद्दा नहीं उठाया है, इसलिए मुझे नहीं पता कि यह कितना अच्छा काम करता है या अगर यह "मेरे लिए अज्ञात" कारण के लिए असफल हो जाता है।

यह सिर्फ कैसे मैं तार्किक परियोजना शुरू करने के बारे में जाना है।

+0

जहाँ तक मेरा अपने दृष्टिकोण को समझते हैं, यह मेरे की आवश्यकता होती है हमारे आवेदन में से निपटने के पूरे संसाधन जो वर्तमान में Windows प्रपत्र द्वारा नियंत्रित किया जाता (कहीं गहरे 'Pen' भीतर,' Graphics' और 'Bitmap') के पुनर्लेखन के लिए होगा - बस के लिए संसाधन हैंडल लीक के लिए परीक्षण की खातिर। चूंकि इस तरह के परीक्षण आमतौर पर एक नए संस्करण को रिलीज़ होने से पहले किया जाता है, इसलिए मैं मौजूदा उपकरणों के साथ अनुप्रयोग व्यवहार का पालन करूंगा। किसी भी तरह, आपके सुझाव के लिए धन्यवाद - मैं प्रयास की सराहना करता हूं। – Gene

+0

निश्चित रूप से तैनात करने से पहले ऐसा न करें, नहीं। हालांकि, यह आपके आवेदन के लिए ध्यान में रखने के लिए एक बेहतर डिजाइन होगा। भावी रिलीज सोचो। :) – jp2code

संबंधित मुद्दे