2009-05-15 16 views
11

Próbuję wyśledzić problem w naszym kodzie MFC, który wygląda jak problem z ograniczeniem zasobów. Pamięć i procesor wyglądają dobrze. Zgodnie z zakładką procesów w Menedżerze zadań nasze obiekty GDI są zgodne z innymi aplikacjami, ale nasze obiekty UŻYTKOWNIKÓW wydają się być o 10 razy większe od innych aplikacji.Co to są "obiekty USER" systemu Windows

Co to jest "obiekt USER" i jakie są ograniczenia?

Odpowiedz

12

Tutaj jest „klasyczny” MSDN artykuł: Give Me a Handle, and I'll Show You an Object

Ostatni raz byłem tropienia przecieki obiektów Windows (które podejrzewam masz) Process Explorer był przydatny (handley?). Dolny panel może pokazywać niektóre przydzielone obiekty systemowe, a także może wykonywać proste liczenie obiektów w trybie USER, GDI itp.

desktop heap, która jest pulą pamięci, w której rzeczywiste "rzeczy" uchwyt reprezentuje życie (przynajmniej niektóre uchwyty, a nie przynajmniej jądro). Czasami nie tyle liczba uchwytów przydzielonych, ale ile pamięci każdy z nich używa pod tym uchwytem. Możesz debugować stertę this way. Jest to pain do zainstalowania.

11

Przeczytaj o tym here:

Object Kategorie

System oferuje trzy kategorie obiektów: User Interface urządzeń graficznych (GDI) i jądra. System używa obiektów użytkownika do obsługi zarządzania oknami, obiektów GDI do obsługi grafiki i obiektów jądra w celu obsługi zarządzania pamięcią, wykonywania procesów i komunikacji między procesami (IPC). Aby uzyskać informacje na temat tworzenia i używania określonego obiektu, zapoznaj się z powiązanym omówieniem.

Obiekty użytkownika

Obiekty interfejsu użytkownika obsługują tylko jeden uchwyt na obiekt. Procesy nie mogą dziedziczyć ani duplikować uchwytów do obiektów użytkowników. Procesy w jednej sesji nie mogą odwoływać się do uchwytów użytkownika w innej sesji.

Istnieje teoretyczny limit 65 536 użytkowników na sesję. Jednak maksymalna liczba uchwytów użytkownika, które można otworzyć na sesję, jest zwykle mniejsza, ponieważ wpływa na nią dostępna pamięć. Istnieje również domyślny limit dla poszczególnych procesów dla użytkowników. Aby zmienić ten limit, należy ustawić następującą wartość rejestru:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota

Wartość ta może być ustawiona na liczbę pomiędzy 200 a 18000.

1

nie wiem co są, ale wiem one zawierać Klamki okienne.

Dla okna uchwyty istnieje system o szerokości maksymalnie około 32000, a maksymalna za proces 10000. (To może być tylko USER granica obiektu, a nie tylko klamek okiennych.)

Liczba klamek okiennych może być bardzo wysoki, jeśli w jakiś sposób przeciekasz przez uchwyty okienne lub jeśli używasz ogromnej ilości okien. (Zauważ, że nawet proste kontrole jak etykieta tekstu zużywa pojedynczy uchwyt okna.)

+1

Wszelkie odniesienia firmy Microsoft do limitu 32000? –

+0

Wpadłem na limit 10000 dla procesu.Po osiągnięciu limitu otrzymasz komunikat "błąd tworzenia klamki okna" podczas próby utworzenia nowego obiektu WinForm. –