ProgressBar stürzt ab
Andreas Eugster
Hallo zusammenIch habe bei meinem Addon eine ProgressBar eingebaut, da ich mehrere Steps zu erledigen habe, welche etwas länger dauern (nach jedem Step gibt es wieder eine neue ProgressBar).
So implementiere ich diese:
int kb = Convert.ToInt32(sr.BaseStream.Length / 1024);
ProgressBar pb = SwissAddonFramework.B1Connector.GetB1Connector().Application.StatusBar.CreateProgressBar(" Process...", kb, true);
pb.Value = 0;
//Hier steht Code
pb.Value = kb;
pb.Stop();
pb = null;
In der Beilage habe ich noch die Fehlermeldung angehängt, welche immer während der Ausführung der 2. Progressbar ausgegeben wird.
Grüsse
Andreas Eugster
EDIT: Wollte das Tehma hier eigentlich im Coresuite Famework posten, könnte das evt einer noch verschieben? Besten Dank
Attachment
[url=http://www.coresystems.ch/wp-content/../wp-content/forum-image-uploads/andreas-eugster/Fehler.JPG]Fehler.JPG[/url]
Manuel Marhold
Hi Andreas,benutze System.Runtime.InteropServices.Marshal.ReleaseComObject(pb).
es gibt auch noch
System.GC.WaitForPendingFinalizers();
System.GC.Collect();
weiss aber nicht, in wie weit das hilft.
Andreas Eugster
Hi Manuel,Den GC kenn ich bereits, doch in wie fern soll mir dieser bei meinem Problem helfen?
Weiter habe ich noch nie die Methode System.Runtime.InteropServices.Marshal.ReleaseComObject() gebraucht. Wie genau funktioniert diese? Habe in der msdn-Help mal nachgelesen, doch versteh ich da herzlich wenig :)
Besten Dank für deine Hilfe
Gruss
Andreas
Manuel Marhold
Hi Andreas,du weisst, dass das .Stop die Progressbar löscht?
Das ReleaseComObject ist zu entfernen von COM-Objekten, die bei =null nicht richtig gelöscht werden. ist ein Problem der COM-Objekte. Die Progressbar hat diese Problem.
Insgesamt ist die Progressbar sehr instabil. Ich habe um jeden Zugriff auf die Progressbar ein try-catch umgebraut. Die Progressbar stürtzt gerne mal öfter ab.
Der fehler besagt nur, dass die Progressbar über den Befehl .Stop beendet wurde und das danach versucht wird, ein Wert zuzuweisen.
Debugge das mal, an welcher stelle deines Code knallt es?
Andreas Eugster
Hi Manuel,Es stürzt zu diesem Zeitpunkt ab, als ich versuche einen Wert einzutragen:
myProgressBar.Value = 223;
Jedoch ist dieses Codeschnippsel in einer For-Schleiffe. Natürlich mache ich myProgressBar.Stop() erst nachdem ich die For-Schleiffe verlassen habe. Daher erscheint mir auch der Fehler ein bisschen Rätselhaft. Soll ich also nach dem ersten Step das Objekt der ProgressBar an die von dir gepostete Methode übergeben?
GC.Collect() habe ich bereits drin, was jedoch leider nichts gebracht hat.
Gruss
Andreas
Manuel Marhold
Hi Andreas,das Release solltest du anstelle von =null am ende machen.
das gc.collect ist nur dafür, das der GarbageCollector den freien Arbeitsspeicher neu überprüft
rufst du unterfunktionen auf, die evtl. eine eigene Progressbar erstellen?
Andreas Eugster
So habe jetzt mal folgenden code nach dem die Progressbar durchgelaufen ist ergänzt:
System.Runtime.InteropServices.Marshal.ReleaseComObject(pb);
GC.Collect();
Nun funktioniert es :)
Besten Dank für deine Hilfe
Andreas Eugster
[quote]"ManuelMarhold"]Hi Andreas,
das Release solltest du anstelle von =null am ende machen.
das gc.collect ist nur dafür, das der GarbageCollector den freien Arbeitsspeicher neu überprüft
rufst du unterfunktionen auf, die evtl. eine eigene Progressbar erstellen?
[/quote]
Nein, die neue Progressbar wird nach der 1. erstellt usw..
Manuel Marhold
Hi Andreas,freut mich..
aber bedenke: GC.Collect benötigt Zeit. Ich habe gelesen, dass man das nur einsetzen soll, wenn es nicht anders geht.
Also evtl. auch mal ohne das GC-Collect versuchen und dann den Speicherverbrauch deines AddOns testen.
Andreas Eugster
Halo ManuelBesten Dank für die Info.
Ich schaue mir das noch genauer an :)
Gruss
Andreas
0
Please sign in to leave a comment.
Comments
0 comments