Zum Inhalt springen

Progressbar mit Schleife steuern


LoTeX

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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#

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...