Veröffentlicht 9. Juni 200916 j Hallo!!! Ich habe einen Thread in VB.NET erstellt und darin will ich den Wert einer Progressbar erhöhen. Als einfache Methode konnte ich die Progessbar updaten…aber mit dem Thread klappt es nicht mehr ? Die Progessbar liegt auf einer Windowsform und wird so mit dem Designer erstellt Friend WithEvents pbrSENDMAIL As System.Windows.Forms.ProgressBar Wenn ich das Programm im Debugmodus durchlaufe, dann erhalte ich anstatt einen Wert den Hinweis : Reference to a non-shared member requires an object reference. Also dachte ich, ich müsste den modifier Friend in „Public Shared“ ändern. Der Hinweis ist nun weg…aber der Wert der Progressbar wird nach wie vor NICHT verändert… Ich hoffe ihr versteht mein Anliegen. Hat jemand schon mal so ein Problem gehabt und kann mir bei dieser Sache behilflich sein?? LG Sarene
9. Juni 200916 j BackgroundWorker Class (System.ComponentModel) BackgroundWorker.ReportProgress Method (Int32) (System.ComponentModel)
9. Juni 200916 j Autor Ok...danke!! ich habe jetzt eine Progressbar und einen Backgroundworker auf meiner WindowsForm ... der Backgroundworker wird so augerufen backgroundWorker.RunWorkerAsync() und die dafür notwendige Funktion Private Sub backgroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundSerienmail.DoWork For i = 0 to x 'Anweisung System.Threading.Thread.Sleep(1000) backgroundWorker.ReportProgress((i / x) * 100)) next i End Sub anschließend wird im Designer folgende Methode angelegt... Private Sub backgroundWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles backgroundWorker.ProgressChanged Me.progressbar.Value = e.ProgressPercentage End Sub So..der Funktionsaufruf findet statt...allerdings liefert mir e.ProgressPercentage immer 0...??? Fällt jemandem auf, was ich vergessen haben könnte?? LG Nadine Edit: Danke Hahne...habe deinen Link erst eben gesehen..vielleicht hilft mir das ja schon weiter ;-)
9. Juni 200916 j private void UpdateMyProgBar() { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(UpdateMyProgBar)); return; } //Hier dann die Progressbar ansprechen } Oh zu spät gesehn, dass du schon wieder was geschrieben hast... sry weiß grad auch nicht warum er kein Wert mitliefert.
9. Juni 200916 j Wo kommt i her, wo kommt x her? Ist es gewollt, dass man den Thread nicht abbrechen kann?
9. Juni 200916 j Ist es gewollt, dass man den Thread nicht abbrechen kann? Auf was ist das jetzt bezogen? Auf den Backgroundworker? Wenn ja bin ich gerade am überlegen. Ich glaube der Backgroundworker hatte noch eine Property in der man einstellen konnte ob Threadabbrüche erlaubt sind oder nicht. Bin mir aber nicht sicher. Musste mal nachschauen.
9. Juni 200916 j Autor Wo kommt i her, wo kommt x her? Ist es gewollt, dass man den Thread nicht abbrechen kann? i und x haben bei mir festgelegte Werte, die hab ich nicht mitreinkopiert,damit der Code (hoffentlich!) etwas übersichtlicher aussieht... Und das mit dem Abbrechen werde ich noch machen... also daran liegts nicht... das Problem ist...dass ich von einer Klasse versuche auf ein Steuerelement einer WindowsForm zuzugreifen...ich habe keine Instanz von der WindowsForm ...mein Ausbilder meint, dass normalerweise der Debugger an der Stelle halten müsste...macht er aber nicht. Er bringt nur die Meldung (wie oben schon mal erwähnt...), Reference to a non-shared member requires an object reference. wenn ich den Wert mit "ADD Watch" auslese (ich benutze Visual Studio 2008). Also wie kann man Steuerelemente einer WindowsForm von fremden Klassen "ansprechen"...in den Properties der Progressbar gibt es als modifier "Friend,Protected Friend, Public,Protected,Private"...aber es müsste doch Shared sein, dass ich die Werte auch ändern kann??? Oder bin ich jetzt komplett auf einem falschen Dampfer?? Bearbeitet 9. Juni 200916 j von Sarene
9. Juni 200916 j du könntest dein form auch einfach an die klasse übergeben. im form machst du dann einfach ne methode die du dann nutzen kannst.
10. Juni 200916 j Er bringt nur die Meldung (wie oben schon mal erwähnt...), Reference to a non-shared member requires an object reference. Hatte vergessen mir den Eröffnungspost durchzulesen. Die Progressbar sollte nicht statisch (shared) sein. Denn das heißt, dass sie für jede Instanz der Klasse gleichzeitig benutzt wird (böse bei Multithreading).
10. Juni 200916 j Autor Danke für eure Tipps !!! :-) Ich habe es jetzt so gelöst, dass ich eine neue WindowsForm erstellt habe,die ausschließlich die Progressbar enthält... Im Konstruktor meiner Klasse wird die Form instanziert und beim "Sendevorgang " wird die Form mit der Progressbar angezeigt. Auf diese Weise kann ich das Steuerelement aus der Klasse heraus "ansprechen". Danach schließe ich die Form wieder. Jetzt klappt es so, wie ich es mir vorgestellt habe.. ist zwar bestimmt nicht die sauberste Methode :-)..aber im Moment fällt mir nichts besseres ein!! LG Sarene
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.