Laden...

Progressbar/Marquee wird nicht aktualisiert

Erstellt von Vril vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.914 Views
V
Vril Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren
Progressbar/Marquee wird nicht aktualisiert

Hallo,

ich habe ein Problem mit einem Progressbar (Marquee), er blockiert bzw. das Fenster in dem dieser Progressbar liegt wird überhaupt nicht richtig angezeigt. Ich habe hier schon einiges zum Thema gelesen, "Warum blockiert meine GUI" oder auch "Controls von Thread aktualisieren lassen (Control.Invoke)"....nur hat mir das ganze nichts geholfen bzw. vielleicht steh ich auch irgendwie auf der Leitung!?

Vielleicht kann mir ja in meinem Fall vielleicht trotzdem jemand explizit weiter helfen. Hier mein Problem:

Ich habe eine (Haupt)-Form, von der aus starte ich einen Dialog (Konfiguration) in dem ich verschiedene Einstellungen machen kann, diesen "Dialog" rufe ich nach Button click wie folgt auf:


Form currentForm = Application.OpenForms["Konfiguration"];
            if (currentForm == null)
            {
                currentForm = new Konfiguration();
            }

            currentForm.Show();
            currentForm.Focus();

In Konfiguration stelle ich dann z.B. zwei Werte ein und clicke auf "Ausführen", dann werden entsprechende Methoden aufgerufen die etwas zeit beanspruchen, währendessen soll ein Progressbar/Marquee einfach hin und her laufen, das ganze mache ich so:


 private void buttonDone_Click(object sender, EventArgs e)
        {            
            float wert1 = Convert.ToSingle(numericUpDown_wert1.Value);
            float wert2= Convert.ToSingle(numericUpDown_wert2.Value);
            this.Cursor = Cursors.WaitCursor;
            konfigurieren(wert1, wert2);
            Close(); //"Dialog" wieder schliessen           
        }
public void konfigurieren(float wert1, float wert2)
        {
        
           WartenProgresser progressMarquee = new WartenProgresser();
           progressMarquee.Show();

            int konfigurieren = 0;
            
                try
                {
                    
                    konfigurieren = MeineDll.Konfigurieren(wert1, wert2);
                }
                catch (Exception) { }
                this.Cursor = Cursors.Default;
progressMarquee.Dispose();
}

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Vril,

vielleicht steh ich auch irgendwie auf der Leitung!?

vermutlich, aber heute ist ja ein neuer Tag. Lies die FAQ einfach nochmal.

dann werden entsprechende Methoden aufgerufen die etwas zeit beanspruchen

Genau die musst du in einen extra Thread verlagern.

herbivore

B
293 Beiträge seit 2008
vor 15 Jahren

Probier's mal so:


BackgroundWorker bgw = new BackgroundWorker();

private void buttonDone_Click(object sender, EventArgs e)
        {
            float wert1 = Convert.ToSingle(numericUpDown_wert1.Value);
            float wert2= Convert.ToSingle(numericUpDown_wert2.Value);
            this.Cursor = Cursors.WaitCursor;


 bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
            bgw.RunWorkerAsync();

           
                     
        }



void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
 konfigurieren(wert1, wert2);
}

 void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
Close(); //"Dialog" wieder schliessen  
}

public void konfigurieren(float wert1, float wert2)
        {

           WartenProgresser progressMarquee = new WartenProgresser();
           progressMarquee.Show();

            int konfigurieren = 0;

                try
                {

                    konfigurieren = MeineDll.Konfigurieren(wert1, wert2);
                }
                catch (Exception) { }
                this.Cursor = Cursors.Default;
progressMarquee.Dispose();
} 

Das wäre ein Beispiel, wie du deine rechenintensiven Aufgaben in einen anderen Thread verlagerst.
Du kannst das natürlich auch direkt über Thread mythread = new Thread()... oder einen Timer machen, aber in deinem Fall sollte ein Backgroundworker am praktischsten sein.

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo blutiger_anfänger,

ist ja nett, dass du als blutiger_anfänger helfen willst, aber so wird das nicht klappen, weil du auch einige GUI-Operationen (z.B. das Erzeugen des ProgessBars) fälschlicherweise in den BackgroundWorker verlagert hast.

herbivore

V
Vril Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren

@blutiger_anfänger
Vielen Dank für deinen Tip!!! 😃
Aber leider hat das auch nicht geholfen, das Problem besteht weiterhin, sprich das Fenster mit dem Marquee Progresser wird nicht richtig/teilweise angezeigt! 😦

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Vril,

ich habe es im Prinzip schon oben geschrieben, aber vielleicht muss ich deutlicher sagen: Wir werden dir die Lösung nicht vorkauen. In der FAQ steht alles, was du wissen musst.

herbivore