मैं वर्तमान में विंडो हैंडल की वर्तमान संख्या और सिस्टम-व्यापी विंडो हैंडल सीमा सी # में प्राप्त करना चाहता हूं। यह कैसे करना है?आप .NET में वर्तमान विंडो हैंडल गणना और विंडो हैंडल सीमा कैसे प्राप्त करते हैं?
उत्तर
रेमंड चेन के रूप में यह कुछ समय पहले डाल दिया, अगर तुम,, खिड़की संभाल सीमाओं के बारे में सोच रहे हैं तो आप शायद वैसे भी कुछ गलत हो :)
कर रहे हैं, मुझे यकीन है कि वहाँ कोई विशेष सी # यह करने के लिए रास्ता नहीं है क्योंकि यह बहुत प्रणाली-विशिष्ट है। आप उसी फ़ंक्शन का उपयोग कर सकते हैं जिसका उपयोग आप C++ एप्लिकेशन में करेंगे। पी/Invoke का उपयोग कर कार्यों को बुलाओ। आयात लिखना सीखने के लिए, pinvoke.net पर जाएं।
संपादित करें: जैसा कि मैं आपका प्रश्न समझता हूं, मुझे लगता है कि आप पहले ही जानते हैं कि Win32 एप्लिकेशन में इसे कैसे किया जाए।
पूर्ण उद्धरण OregonGhost को संदर्भित करता है
है आप से पूछना करने के लिए है, तो आप शायद कुछ गलत कर रहे हैं।
यह Why is the limit of window handles per process 10,000? से है आपको इसे पढ़ना चाहिए।
यदि आप रेमंड चेन की पोस्ट पढ़ते हैं, तो शायद आपको यह उतना ही परेशान लगेगा जैसा मैंने किया था। आप केवल "कुछ गलत कर रहे हैं" क्योंकि आप ऐसा कुछ कर रहे हैं जो विंडोज सक्षम नहीं है।
मेरे आवेदन में, पहली बार उपयोगकर्ता एक टैब पेज पर जाता है, मैं उस पृष्ठ पर सभी नियंत्रण बना देता हूं और रखता हूं। इसमें एक उल्लेखनीय समय लगता है - पृष्ठ पर आसानी से 50 नियंत्रण हो सकते हैं। इसलिए यदि मैं इसे संभवतः पॉपुलर करने के बाद किसी टैब पेज पर नियंत्रणों को त्याग नहीं देता हूं, और उपयोगकर्ता तक टैब पृष्ठों के बंद सेट छोड़ देता हूं।
जैसा कि होता है, कुछ उपयोगकर्ता टैब पेजों के सेट को बंद नहीं करना चाहते हैं। मुझे उन्हें मजबूर क्यों करना चाहिए? मेरे यूआई के साथ, वे लेनदेन के 300+ सेटों में से किसी एक को बहुत तेज़ी से नेविगेट कर सकते हैं कि वे प्रबंधन के लिए ज़िम्मेदार हैं। उनकी मशीनें बहुत तेजी से हैं, और यह सब बहुत ही संवेदनशील बनाने के लिए पर्याप्त स्मृति है। एकमात्र समस्या यह है कि विंडोज इसका समर्थन नहीं कर सकता है।
मैं नियंत्रण का उपयोग क्यों कर रहा हूं, न कि कुछ अन्य यूआई तकनीक? क्योंकि वे काम काम करते हैं। मुझे फ़ोकस ईवेंट, टैब ऑर्डर, सत्यापन ईवेंट, डायनामिक लेआउट और डेटा बाइंडिंग का समर्थन करने की आवश्यकता है - उपयोगकर्ता वास्तव में हजारों रिकॉर्डों का प्रबंधन करते हैं, दर्जनों टेबल में, इन-मेमोरी डेटासेट में। विकास की मात्रा मुझे करना है - कहें - खिड़की रहित नियंत्रणों का उपयोग करके कुछ लागू करना खगोलीय है।
मैं केवल "इसे गलत कर रहा हूं" क्योंकि विंडोज़ की खिड़की हैंडल की संख्या पर हार्ड सीमा है जो इसका समर्थन कर सकती है। यह हार्ड सीमा दशकों पुरानी मान्यताओं के समूह पर आधारित है कि कंप्यूटर का यूआई कैसे बनाया जा सकता है। यह मैं नहीं हूं जो "कुछ गलत कर रहा है।"
किसी भी दर पर, मेरा समाधान दो भागों में है।
सबसे पहले, एक वर्ग है कि आप कितने खिड़की संभालती अपनी प्रक्रिया का उपयोग कर रहा है बता सकते हैं:
using System;
using System.Runtime.InteropServices;
namespace StreamWrite.Proceedings.Client
{
public class HWndCounter
{
[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
[DllImport("user32.dll")]
private static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags);
private enum ResourceType
{
Gdi = 0,
User = 1
}
public static int GetWindowHandlesForCurrentProcess(IntPtr hWnd)
{
IntPtr processHandle = GetCurrentProcess();
uint gdiObjects = GetGuiResources(processHandle, (uint)ResourceType.Gdi);
uint userObjects = GetGuiResources(processHandle, (uint)ResourceType.User);
return Convert.ToInt32(gdiObjects + userObjects);
}
}
}
दूसरा, मैं अपने टैब पृष्ठ वस्तुओं की एक हाल ही सबसे कम इस्तेमाल किया कैश बनाए रखें। .NET Framework एक सामान्य एलआरयू कैश क्लास प्रदान नहीं करता है, इसलिए मैंने एक बनाया है, जिसे आपको here मिल सकता है यदि आपको एक की आवश्यकता है। जब भी उपयोगकर्ता एक टैब पेज पर जाता है, तो मैं इसे एलआरयू कैश में जोड़ता हूं। फिर मैं यह देखने के लिए जांच करता हूं कि क्या मैं खिड़की हैंडल पर कम चल रहा हूं।यदि मैं हूं, तो मैंने कम से कम हाल ही में उपयोग किए गए टैब पेज पर नियंत्रण फेंक दिया है, और तब तक ऐसा करते रहें जब तक कि मेरे पास पर्याप्त खिड़की हैंडल न हों।