ProgressBar stürzt ab

Andreas Eugster

Hallo zusammen
Ich 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 Manuel

Besten Dank für die Info.

Ich schaue mir das noch genauer an :)

Gruss

Andreas
0

Comments

0 comments

Please sign in to leave a comment.

Didn't find what you were looking for?

New post