Laden...

Error creating window handle

Erstellt von DeadEye vor 16 Jahren Letzter Beitrag vor 15 Jahren 2.676 Views
D
DeadEye Themenstarter:in
55 Beiträge seit 2008
vor 16 Jahren
Error creating window handle

Hallo zusammen!

Ich habe folgendes Problem:
Ich habe vor ca 1 Jahr eine Applikation (eine Art Verwaltungssoftware) fuer einen Kunden geschrieben, das war damals meine erste .Net Applikation.

Das Programmfenster ist in 2 Hauptbereiche geteilt, links die Modulauswahl und rechts das Hauptfenster des Moduls.

In diesem Hauptfenster gibt es ein TabControl mit 6 Tabs.
In diesen Tabs befindet sich jeweils ein Panel welches eine Liste aus von mir erstellten UserControls darstellt. JEdes UserControl beinhaltet 4-6 Buttons, mehrere Labels und mehrere Pictureboxen.

Jede Liste beinhalted bis zu 100 dieser Controls.
Wenn ich nun das Programm nebenbei im TaskManager beobachte stelle ich fest, das sowie ich so eine Liste darstellen lasse die Anzahl der 'BENUTZER-Objekte' in die hoehe schnallst (ca 2500 bei einer Liste von 100 UserControls). Wenn ich jetzt auf ein weiteres Tab schalte erhoeht sich die anzahl der 'BENUTZER-Objekte' wieder um 2500 und so weiter. Das ist natuerlich enorm.

Die Anzahl der Handels liegt bei ca 500, die anzahl der Threads bei ca 20. GDI-Objekte gibt es laut Taskmanager ca 120.

Wenn nun die Anzahl der Benutzer-Objekte eine gewisse Anzahl uebersteigt (je mehr Programme offen sind, umso niedriger ist diese Anzahl dann) stuertzt das Programm mit einer Exception ab die lauted 'Error creating window handle'

Beim Panel indem die UserControls drinnen sind habe ich bereits versucht zu berechnen wann Objekte Visible sein sollen und wann nicht, das hat auch ein bischen geholfen, aber wenn man mal ganz nach unten gescollt hat kommt man wieder auf die 2500 Objekte)

Wie kann ich mein Programm Ressourcensparender machen, vorallem bei diesen 'BENUTZER-Objekten'??

MfG DeadEye

Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop

Gelöschter Account
vor 16 Jahren

indem du nur das erzeugst, was auch dargestellt werden soll.

schlecht ist, wenn du ein usercontrol hast, das 100 mal vorhanden ist... wieviel können denn gleichzeitig dargestellt werden? 5? oder 10? dann erstell nur 5 oder 10 und beim scrollen tauschst du nur die werte der controls.

so wie ich das sehe benutzt du die controls als datenhaltung mit und das ist das wesentliche problem. die gui ist zur anzeige bestimmt, nicht aber um daten zu halten.

D
DeadEye Themenstarter:in
55 Beiträge seit 2008
vor 16 Jahren

@JAck30lena

Okay, das liesze sich bewerkstelligen, aber wie erhalte ich dann die Daten? Lasse ich den DataTable, indem ich die Daten bekomme, in einem Objekt einfach weiter bestehen?

Ich komme urspruenglich aus der Web-Welt darum habe ich das Panel mit Scrollbar quasi gleichbehandelt wie ein HTML-Div was vermutlich der Fehler ist.

Aber wenn ich jetzt, sagen wir 10 mal diese Objekt erzeuge, wenn ich dann runterscrolle in diesem Panel, lasse ich das Oberste UserControl einfach unten drannhaengen wenn es im Panel selbst nicht mehr sichtbar ist?
Da ist ja doch noch einiges an Berechnungen noetig, richtig?

MfG DeadEye

Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop

Gelöschter Account
vor 16 Jahren

was das scrollen betrifft:
du setzt die eigenschaft autoscroll auf fals (vom panel) und die eigenschaft showscrollbars ebenso, dann ziehst du eine vscrollbar auf die form.

so, jetzt beim laden der objekte, schaust du wieviele du hast (.Count) und versorgst damit die scrollbar. wenn der user nun scrollt, musst du auf das entsprechnde event reagieren und je nach scrollindex die werte anpassen.

was das datenhaltungproblem betrifft:
da du ja sowieso schon eine tabelle hast, dann schau dir mal vom panel das property "Tag" an. genau da rein stopfst du die tabelle und von dort kannst du sie dann auch immer rausholen, wenn der user scrollt.

D
DeadEye Themenstarter:in
55 Beiträge seit 2008
vor 16 Jahren

Okay, ich werde das mal versuchen, hoert sich aber alles gut und logisch an.
Ganz dickes Danke von mir mal 😁

MfG DeadEye

Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop

D
DeadEye Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren
Benutzer-Objekte - GDI-Objekte

([EDIT=herbivore]Threads zusammengefügt. Bitte keine Crossposts bzw. Reposts)[/EDIT]){orange}

In einer meiner Anwendung ist mir aufgefallen das ich in etwa 4.000 Benutzer Objekte und 80 GDI-Objekte habe (im Taskmanager)

Wo ist der unterschied zwischen denen, den ich weis zumindest das ich so eine hohe zahl an Benutzer Objekten habe da im Programm in einem Panel eine recht grosze Anzahl von Panels, Labels und Buttons hinzugefuegt wird. Leider crashed ab und zu die Applikation mit der Fehlermeldung dass das Erstellen eines Windows Handles nicht durchgefuehrt werden konnte, wobei allerdings die Spalte "Handles" im Taskmanager bei 'nur' 550 liegt fuer mein Programm.

Auf was genau Beziehen sich also Benutzer-Objekte? Auf Controls wie Buttons und Panels? Ich benoetige da leider eine grosze Anzahl gibts ne bessere Methode wie ich das Umsetzen kann? (Liste mit Buttons und Labels?)

MfG DeadEye

Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop

2.760 Beiträge seit 2006
vor 15 Jahren

Hmm... habe auch keine Ahnung was Benutzer-Objekte sind...

Ich benoetige da leider eine grosze Anzahl gibts ne bessere Methode wie ich das Umsetzen kann? (Liste mit Buttons und Labels?)

Evtl. wäre ein DataGridView für dich eine Alternative...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo DeadEye,

das mit dem Benutzerobjekten, kenne ich nicht, aber zumindest kann ich bestätigen, dass es Probleme verursacht, wenn man viele Controls erzeugt (ganz egal, was der Taskmanager anzeigt).

Der springende Punkt ist die Anzahl der Controls zu vermindern.

Entweder durch ein Listencontrol (ListBox, ListView, DataGridView,), wie das jaensen vorschlägt oder falls das nicht passt siehe Optimierungsideen ?

herbivore

4.931 Beiträge seit 2008
vor 15 Jahren

Du hattest doch schon mal diese Frage gestellt: Error creating window handle ???

Und zur Vermeidung der Fehlermeldung mußt du halt dein Programm umdesignen, d.h. nur die Controls erstellen, welche du auch aktuell gerade benötigst und alle unsichtbaren Controls disposen.
Dazu muß dein Programm aber die strikte Trennung von GUI und Daten einhalten.

Evtl. z.B. einfach das DataGridView benutzen bzw. die Texte selber zeichnen (mittels Graphics.DrawString), da jedes Label ein Handle belegt.

D
DeadEye Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

Es ging damals um das selbe Thema richtig, eigentlich haette ich in dem Post schreiben sollen anstatt einen Thread aufzumachen.

Okay soweit ist es mir klar. Aber was genau sind diese Benutzer-Objekte im vergleich zu den GDI-Objekten...?

Zu den Benutzer Objekten findet sich leider auch net alzu viel in google (wohingegen sich zu den Handels und GDI Objekten dutzende Sachen finden lassen) und mich wuerde vorallem eben intressieren was die eben so tun, diese Objekte...

Prinzipiell nutze ich die Objekte nicht zur Datenerhaltung, die einzige Info die sie erhalten muessen ist die ID fuer einen Klick der Buttons. Die Methode mit das ich nur eine bestimmte Anzahl an Objekten z.B. 10 Darstelle und nur die Daten quasi verschiebe ist damals irgendwie gescheitert, ich hatte zwar angefangen, hatte aber dann das problem das jede Zeile von Eintraegen eine unbekannte Hoehe hat, abhnaegig davon was eigentlich dargestellt wird.

Ist es vlt sogar ratsam einfach alles per 'Hand' zu zeichnen? Das Scrollen sind naemlich auch fluessig funktionieren (nicht wie bei einem DataGrid, wo man Zeilenweise springt, sondern eher wie im Webbrowser....)

MfG DeadEye

Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo DeadEye,

letztlich ist doch die Angabe im Taskmanager genauso egal wie die Bedeutung der nachgefragten Begriffe. Wenn ich dich richtig verstehe, willst du einfach eine Lösung für dein Darstellungsproblem. Und da sind hier und in dem verklinkten Thread nun schon verschiedene Vorschläge gemacht wurden.

Ein weiterer wäre einfach das WebBrowser-Control zu verwenden. 😃

herbivore

D
DeadEye Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

Jo die Loesung ist mir ja dank euer Post inzwischen bekannt 😃 Danke nochmal 😉

WebBrowser-Control ist leider keine Option. Wird wohl doch ein quasi selbstgestricktes DataGrid werden muessen (wegen dem Zeilen Problem).

Normal waers mir eh relativ egal was der Taskmanager sagt, nur wuerd ich das gern nur aus interesse wissen was das eigentlich soll 😃 Aber zumindest weis ich das es mit den .Net Controls zu tun hat. Intressant ist auch das unter WPF dasselbe programm bei weitem weniger Benutzer und GDI Objekte hat 😃 das waer vlt auch ne moeglichkeit das ich dorthin umsteig (wenns der Kunde bezahlt 😛)

Danke auf jedenfall nochmal allen die nochmal gepostet haben 😃

Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop

2.760 Beiträge seit 2006
vor 15 Jahren

Wird wohl doch ein quasi selbstgestricktes DataGrid werden muessen

Wenn du auch nur halbwegs die features da rein basteln möchtest wie man sie von einem handelsüblichen Grid gewöhnt ist dann rate ich dir davon aus eigener Erfahrung mal ab 😉
Wenns in erster Linie nur zum Anzeigen und rudimentärem editieren gedacht ist hält sich der Aufwand allerdings in Grenzen.

Evlt. wäre folgendes für dich interessant (Da hat sich bereits jemand eine Menge Arbeit gemacht und es würde mich fast wundern wenn es nicht pixelweise scrollen könnte): http://www.devage.com/Wiki/ViewArticle.aspx?name=sourcegrid&version=0