Błąd podczas tworzenia uchwytu okna

0

Witam wszystkich.

Mam problem, kod przy którym wyskakuje owy błąd wygląda mniej więcej tak:

this.Invoke(new Action(delegate ()
	{
        flowLayoutPanel1.SuspendLayout();
        fLP_urrr = new FlowLayoutPanel();
        flowLayoutPanel1.Controls.Add(fLP_urrr);
        fLP_user.Name = "flowLayoutPanel_urrr" + urrr_index.ToString();
        fLP_user.AutoSize = true;
        fLP_user.FlowDirection = FlowDirection.LeftToRight;
        fLP_user.WrapContents = false;
}));

Problemem jest to, że przy powstaniu 1420 panelu wyskakuje błąd "Błąd podczas tworzenia uchwytu okna". Ktoś wie, jak temu zaradzić?

0

Wciąż analizuje problem.
Powyższym postem nieco mogłem wprowadzić w błąd, z racji że zapomniałem o dynamicznie dodawanych pozostałych 6 kontrolkach. Błąd powstaje dokładnie przy powstawaniu kontrolek o numerze 1424, a dokładnie przy 5 kontrolce z kolei. Czyli dokładnie owy błąd ukazuje się przy tworzeniu 9967 kontrolki w flowLayoutPanel.
Prócz tego dowiedziałem się jeszcze, że problem powstaje także bez użycia wątków i własciwości Invoke.
Próbowałem to rozwiązać automatycznym usuwaniem się kontrolek, kiedy dochodzi do tej granicznej liczby, ale to nic nie pomagało.
Google natomiast mało mówi o samym błędzie :/

2

zdajesz sobie sprawę, że 10.000 kontrolek to jest jakaś masakra. Po pierwsze masz mocno skrzywioną architekturę programu skoro musisz naciapać 10.000 kontrolek. Po drugie zdajesz sobie sprawę, że liczba uchwytów jest ograniczona w systemie do 10.000 dla procesu. Do poczytania
https://blogs.msdn.microsoft.com/oldnewthing/20070718-00/?p=25963
https://blogs.technet.microsoft.com/markrussinovich/2009/09/29/pushing-the-limits-of-windows-handles/
i ogólnie https://www.google.pl/search?q=windows+handles+limit

0

abrakadaber, tak, doszedłem do tego, że 10k to jest limit. Właśnie miałem się zabierać za testowanie metody dispose, ale dzięki oczywiście za odpowiedź :)

0

Niestety nie poszło po mojej myśli. Sądziłem, że gdy po użyciu metody SuspendLayout użyje metody Dispose, to kontrolka będzie dalej widoczna. Niestety wtedy także znika.
Zależy mi na tym, aby pozbyć się samego uchwytu, a nie całej kontrolki. Jest jakiś sposób, aby zniszczyć uchwyt?

1

uchwyt jest nierozelwalnie związany z konkretną kontrolką i nie da się go "pozbyć". Jak już pisałem - masz mocno skopane UI jeśli musisz stworzyć ponad 10000 kontrolek.

0

Rozumiem. Więc dalej szukam rozwiązania problemu, bo jakieś musi być.
Kontrolki, które tworze dynamicznie, to jedynie flowLayoutPanel'e oraz label'e, nic więcej. Także nie potrzebuje ich potem do dalszego użytku, a jedynie jako informacja tekstowo widoczna we flowLayoutPanel.
Jedyne obejście jakie mi przychodzi na myśl, to zamaist tworzenia dynamicznie nowych label'i po prostu stworzyć 1 label i dynamicznie do niego dodawać nową treść, ale domyślam się, że byłby problem ze zrobieniem odpowiednich odstępów między treściami oraz różnym rozmairem czcionki danych tekstów, także to chyba odpada.
Kolejną kwestią jest to, że widziałem już w jednym programie takie rozwiązanie, że były dynamicznie tworzone label'e w nieskończoność i nie było żadnych problemów, więc musi być jakieś konkretne rozwiązanie.

1

od wyświetlania informacji w postaci siatki jest grid, szczególnie że jedynymi kontrolkami jakie tam wkładasz to label

1 użytkowników online, w tym zalogowanych: 0, gości: 1