LoTeX Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 Hallo zusammen, ich will eine progressbar über ne schleife steuern. private void Form1_Load(object sender, EventArgs e) { int x; int y; for (x = 0; x < 101; x++) { for (y = 0; y < 9000000; y++) { } ultraProgressBar1.Value = x; ultraProgressBar1.Refresh(); } } nun wird mir aber die progressbar erst angezeigt, sobald sie bei 100 % ist. bei nomal c++ hat es so immer funktioniert. ne große schleife dazwischen dass es langsam hochzählt und sonst wars das.... ideen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 ideen? BackgroundWorker :floet: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
LoTeX Geschrieben 21. September 2009 Autor Teilen Geschrieben 21. September 2009 Ja gut okay, danke. das könnt was sein so wie ich es eben nachgelesen hab. Hat jemand vielleicht noch ein codebeispiel oder eine Art des auf meine verwendungs anzupassen? habe diesen backgroundworker noch nie verwendet und im i-net find ich kein gutes bsp.... wäre nett von euch. gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
JasonDelife Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 Ergänzend zu TDM: In einem Fensterprogramm gibt es eine Nachrichtenschleife, die Nachrichten (Klicks und so, also Ereignisse) sequentiell, also hintereinander ausführt. Dabei läuft die Schleife und alle Nachrichten im GUI-Thread. Dauert ein Vorgang innerhalb eines Ereignisses (allgemein innerhalb des GUI-Threads) sehr lange, so hält das die Nachrichtenverarbeitung auf. Zu den Nachrichten gehört auch WM_PAINT, welche das Neuzeichnen eines Fenster oder Steuerelements veranlasst. Wird nun aber durch die Schleife die Nachrichtenverarbeitung behindert, so kann sich die ProgressBar erst am Ende der Schleife neu zeichnen. Der von dir beschriebene Effekt ist die Folge. Grundsätzlich sollte man deshalb alle längeren Vorgänge (Internetdownload, Parsen großer Dateien, ...) im Hintergrund ausführen. BackgroundWorker (BgW) ist sicher der bequmste Weg dafür. Wichtig ist aber, dass im Hintergrundvorgang (beim BgW also in DoWork) niemals auf Steuerelemnte zugegriffen werden darf!. Dies kann zu Inkonsistenzen und Abstürzen führen. Dafür gibt es beim BgW die Ereignisse RunWorkerCompleted und ProgressChanged, welche autom. im GUI-Thread laufen. Ich hoffe, das war verständlich. Grüße, JasonDelife. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
LoTeX Geschrieben 21. September 2009 Autor Teilen Geschrieben 21. September 2009 Okay, den Sinn habe ich VErstanden, danke! :uli aber an der umsetzung fehlt es mir noch etwas.... kann mir da jemand etwas helfen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
JasonDelife Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 Was willst du genau bezwecken? Evtl. wäre ein Timer hier besser. Je nach dem, was du genau tun willst. Grüße, JasonDelife. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
LoTeX Geschrieben 21. September 2009 Autor Teilen Geschrieben 21. September 2009 ich bin ja noch ein neuling in c#, ich hab mir deswegen so ein hübsches übungsprogramm geschrieben. ne passwortrabfrage (mit db zugriff für user und passwort), mit neue admins/user hinzufüpgen und so spielereien mit db's usw. nunr wollt ich ne progressbar ausprobieren. /(soll also nicht wirklich etwas ladentes anzeigen), ich will sie ja nur kennenlernen und wollt sie nun zwischen dem login bereich und dem internen bereich einbaun. was weiß ich dass sie z.b. nach erfolgreichen login 10 sek hochlädt dann bei 100% ist und dann das interne menü auftaucht.... verständlich einigermaßen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
JasonDelife Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 Bei reiner Simulation mit der ProgressBar ist ein Timer besser. Du stellst das Interval in Millisekunden ein und registrierst das Ereignis Tick. Dann setzt du Enabled auf true und der Timer feuert alle Interval Millisekunden das Tick-Ereignis. Darin kannst du die ProgressBar.Value eins erhöhen und, wenn sie bei 100 ist, den Timer beenden (Enabled = false). Grüße, JasonDelife. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
LoTeX Geschrieben 21. September 2009 Autor Teilen Geschrieben 21. September 2009 alles klar, ist auch wieder verstanden allerdings wie gesagt auf dem gebiet neu. hast du da ein beispiel (codemäig wo ich das einbaun muss nun usw.)? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
AmunRa Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 bei nomal c++ hat es so immer funktioniert. ne große schleife dazwischen dass es langsam hochzählt und sonst wars das.... Das hat bei C++ sicherlich nicht funktioniert! Ich bezweifle auch das du jemals in C++ GUI-Anwendungen geschrieben hast. Eine ProgressBar wird über einen seperaten Thread bzw. asynchrone Operationen gesteuert, der den Event-Thread geregelt aufruft, so dass die Steuerelemente kontrolliert ugedatet werden können. Der BackgroundWorker wurde bereits genannt. Wenn du ein Codebeispiel aus einer Anwendung suchst, kannst du einen Blick auf den folgenden Artikel werfen. Dort wird auch eine ProgressBar gesteuert. Verbindung zum MySQL-Server mit C# Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Faustenator Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 Also eigentlich bin ich auch für den Lösungsansatz mit dem Backgroundworker oder Timer, eine quick&dirty-Methode wäre noch die folgende: Der Aufruft Application.DoEvents(); in der for-Schleife sollte Dein Problem lösen. Es macht die Anwendung sogar mehr oder weniger benutzbar, aber schön ist es eigentlich nicht. Eine andere elegante Methode (ohne Backgroundworker und Timer) geht über die Schlüsselwörter Thread, Delegate und Invoke/InvokeRequired, welche man schon mal gehört haben sollte wenn man mit viel mit Oberflächen und deren Aktualisierung arbeitet. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 21. September 2009 Teilen Geschrieben 21. September 2009 Viele Antworten und Vorschläge, aber ein wichtiges Problem bleibt unerwähnt: Die Progress Bar wird nicht vorher angezeigt, weil das Load Event bereits vor dem ersten Anzeigen der Form abgearbeitet wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.NETter Geschrieben 22. September 2009 Teilen Geschrieben 22. September 2009 Hallo, hier mal ein kleines Beispiel mit einem Thread. Hier fehlt noch jedes Exceptionhandling also bitte noch ausbauen. Beim Click auf den Button wird die Progressbar bis zum Maximum gefüllt. Da dies alles in einem Thread läuft, kann das Fenster sogar verschoben werden ohne, dass die Darstellung des Fortschritts beeinträchtigt wird. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace _ProgBar { public partial class Form1 : Form { int pbMaxVal = 100000; private delegate void UpdatePBar(int NeuerWert); public Form1() { InitializeComponent(); progressBar1.Value = 0; progressBar1.Maximum = pbMaxVal; } private void cmdStart_Click(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(DoProgressbar)); t.Start(); } private void DoProgressbar() { for (int i = 0; i <= pbMaxVal; i++) { progressBar1.Invoke(new UpdatePBar(this.UpdateMyProgressbar), new object[] { i }); } } private void UpdateMyProgressbar(int NeuerWert) { progressBar1.Value = NeuerWert; } } } Gruß, Thomas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.