Autor Beitrag
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Sa 09.07.11 11:07 
Huhu,

ich hab mich spasseshalber doch weiter mit threads befasst, weil eine Progressbar in einem
anderen Projekt nicht updated, wenn über 20000 XML Zeilen ausgelesen werden.

Der folgende Prozess funktioniert, aber das Label wird nicht geupdated.
Woran könnte das liegen?
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
 private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {       
            for (int i = 0; i < 99; i++)
            {
                XDocument doc_de = XDocument.Parse(Properties.Resources.Text);
                int count_knoten = doc_de.XPathSelectElements("//mehrtext").Count();

                backgroundWorker1.ReportProgress((i*100) / count_knoten);
            }
            Thread.Sleep(100);
        }
        private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            progbar.Value = e.ProgressPercentage;
            toolStripStatus_lbl_anzeige.Text = e.ProgressPercentage.ToString() + " %";
        }
        private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            if (progbar.Maximum == progbar.Value)
            {
                progbar.Enabled = false;
                progbar.Value = 0;
            }
        }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 09.07.11 11:30 
Hallo,

hast du denn auch die Eigenschaft WorkerReportsProgress auf 'true' gesetzt?
Du solltest auch mal den Thread.Sleep() in die Schleife reinschreiben (evtl. geht der Vorgang ansonsten so schnell, daß du die Aktualisierung gar nicht mitbekommst ;-))
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Sa 09.07.11 11:54 
Ja, ich habmir viele tutorials angeschaut, das hab ich nicht vergessen:D

Jetzt hab ich aber ein anderes problem,...
Die ersten Male funktionierte das mit der progressbar, jetzt allerdings
ist der backroundworker andauernd ausgelastet.
Wie kann das sein, er hat doch nur eine einzige Aufgabe???
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Sa 09.07.11 14:20 
Hallo Chiyoko,

anbei ein kleines Testprogramm:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;

namespace ConsoleApplication1
{
    class Program
    {
        

        static void Main(string[] args)
        {
            BackgroundWorker back = new BackgroundWorker();
            back.WorkerReportsProgress = true;
            back.DoWork += new DoWorkEventHandler(back_DoWork);
            back.ProgressChanged += new ProgressChangedEventHandler(back_ProgressChanged);
            back.RunWorkerCompleted += new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);
            back.RunWorkerAsync();
            
            Console.Read();
        }

        static void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine("FERTIG");
        }

        static void back_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            
            Console.WriteLine(e.ProgressPercentage.ToString()+" Prozent");
        }

        static void back_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker b = sender as BackgroundWorker;
            Console.WriteLine("IN_DoWork");
            for (int x = 0; x < 100; x++)
            {
                b.ReportProgress((x * 100) / 100);
                //Thread.Sleep(100);
            }
        }
    }
}



Zum einen muss Dein "Thread.Sleep" in der Schleife und nicht hinter der Schleife platziert werden.
Zum anderen ist mir bei meinem Testprogramm aufgefallen, dass die Zahlen von 1 bis 100 nicht in der korrekten Reihenfolge erscheinen, wenn ich das "Thread.Sleep(100)" weglasse.

Ich bin leider bzgl. Multi-Threading zu unerfahren, um Dir hier sichere Tips zu geben. Allerdings wäre mir ein Thread.Sleep zu unsicher. Woher weiß ich, welche Sleep-Dauer ich benötige, damit das Programm JEDES MAL richtig läuft.

Eine Art Thread.Join() müsste irgendwo hin, aber das sollte vielleicht nochmal jemand erläutern, der hier wirklich fit ist.

Gruß
Frank
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Sa 09.07.11 14:25 
Danke für das beispiel,..ich arbeite mit Threads erst seit gestern.
Es ist ja auch nicht zwingend notwendig, aber berufsbezogen und
aus interesse wüsste ich das schon gerne, aber ich werd einfach weiter testen,
die antwort kommt dann sicher von alleine(wie immer:D)

Das mit thread.Sleep() ist in der Tat komisch aber logisch und Thread.Sleep(1) wäre ja sinnfrei.
Aber bei grossen Aufgaben sollte 1/100tel Sekunde kaum auffallen.