2012-03-15 18 views
13

Mieć aplikację z wyciekiem GDI, która w końcu trafi 10 000 przydzielonych obiektów GDI i ulegnie awarii. Próbowałem zwiększyć liczbę GDIProcessHandleQuota do 20 000, ale program nadal się uległ awarii, gdy osiągnął 10 000 obiektów. Obecnie pracujemy nad poprawieniem tego wycieku, ale z ciekawości - czy istnieje sposób na zwiększenie limitu GDI dla pojedynczego procesu? A może jest to 10-krotny twardy limit indywidualnej aplikacji?Jaki jest górny limit obiektów GDI dla jednego procesu w systemie Windows 7?

+0

Zwiększenie 'GDIProcessHandleQuota' do' 20,000' było dla mnie opłacalne. Musiał ponownie uruchomić system po zmianie rejestru. Zaktualizowano klucz Rejestru w 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota' – Agalo

Odpowiedz

6

Istnieje rozwiązanie, które mogłyby praca . Mam do czynienia z app źle się zachowywał dostawcy tutaj, że przydziela mnóstwo obiektów GDI i to rozwiązanie pozwala mu pracować przez większość czasu ...

Czy

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" /v windows

Look dla SharedSection= które powinny być 3 numery Oddzielone przecinkami. Zwiększ średnią liczbę o 1024 na raz i zobacz, czy to rozwiązuje twój problem. Kontrolujesz ilość "sterty pulpitu" za pomocą tej zmiennej, co w przeszłości pozwoliło mi na uruchomienie nieprawidłowo działającego GDI.

Spójrz na numer KB184802, aby uzyskać więcej informacji. Wyszukaj SharedSection, aby znaleźć odpowiednią część strony.

+0

Bingo! Podskoczyłem na stertę pulpitu i mogę teraz przekroczyć 10 000 obiektów GDI. Nasz główny programista wpadł już na poprawkę, ale teraz moja ciekawość została rozwiązana. Dzięki – Micky

+0

Cześć! Moje SharedSection jest ustawione na 1024,20480,768, ale mój python.exe nadal ulega awarii. Czytałem, że nie jest bezpieczniej zwiększać stertę komputerów ponad 20480? Jakie jest twoje zdanie? – Aleksandar

+0

@Aleksandar: Jeśli dobrze pamiętam, suma wszystkich tych liczb nie może przekroczyć 48 MB. Liczby te odkładają pamięć w kilobajtach. Istnieją również inne ograniczenia w zależności od tego, ile i jakie usługi masz uruchomione. Przeczytaj pierwsze 3 linki w odpowiedzi Derek Parks na dobre tło. Upewnij się także, że nie tworzysz więcej niż 10 000 obiektów GDI. – JimR

15

10K jest sztywnym limitem.

GDI obiektów graficznych przedstawiają środki interfejsu urządzenia jak fontów bitmapy, szczotki, piór oraz kontekstami urządzenia (powierzchni rysunku). Jak ma to miejsce w przypadku obiektów użytkownika, Okno limity menedżer procesów, co najwyżej 10000 GDI obiekty [...]

Mark Russinovich posiada szereg artykułów, które wchodzą w pogłębionej o różnych limitów w systemie Windows. Można znaleźć te dwa przydatne:

Kolejny dobry artykuł z Raymond Chen:

+1

Dzięki za informacje. Przeglądałem artykuły "Przesuwanie granic Windows", zanim napisałem tutaj i zauważyłem, że Mark R.nie pokazuje, jak zmodyfikować rejestr, aby rozszerzyć domyślny limit GDI poza 10k, więc pomyślałem, że mogło to być coś, co przeoczył. Wciąż jestem zdezorientowany, dlaczego ta liczba może być tak wysoka jak 65535, jeśli nie ma zauważalnego wpływu na moją maszynę. Mogę pochłaniać znacznie więcej niż 10 tysięcy obiektów dla wszystkich moich procesów bez opóźnień w systemie Windows. Dopiero gdy jedna aplikacja osiągnie 10k, gdy dojdzie do awarii. – Micky

+0

'10K jest twardym limitem. To chyba nie jest prawdą. Czy możesz dodać szczegóły dotyczące związku ograniczenia, do którego się odwołujesz, w opisie [odpowiedź JimR] (http://stackoverflow.com/a/9723784/2932052) – Wolf

+0

Istnieje klucz rejestru o nazwie GDIProcessHandleQuota. Nie wydaje się, że trudno jest zmienić ten limit. Myślę, że mieszałeś uchwyty GDI i uchwyty User. –

0

Jestem w stanie zwiększyć liczbę obiektów GDI z 10000 do 15000, zmieniając TYLKO GDIProcessHandleQuota, ale wymaga to ponownego uruchomienia. Nie musiałem zmieniać wartości SharedSection, wymagane było tylko ponowne uruchomienie.

Podczas gdy 10000 wydaje się dużą liczbą, moja aplikacja ma duży interfejs użytkownika z mnóstwem przycisków, pędzli, obrazów, ikon itp. Po uruchomieniu aplikacji liczba obiektów zwiększa się tylko wtedy, gdy użytkownik robi coś, co zasługuje na wzrost. Żadne obiekty GDI nie wyciekają z aplikacji. Aby przetestować moje rozwiązanie, dodałem metodę "wycieku", dzięki czemu mogłem obserwować w menedżerze zadań, co się stało, gdy liczba obiektów GDI wzrosła poza różne limity.

Powiązane problemy