Progressbar steuern bei Multithreading

dborni

Grünschnabel
Hallo zusammen,

Ich habe ein Problem mit einer Progressbar in Verbindung mit Multithreading. Ich weiß nicht, wie ich aus dem zweiten Thread heraus die Progressbar steuern kann:


Ich habe eine Methode start in einer Klasse Solver, die aus der Klasse Form1 heraus in einem neuem Thread Berechnung durchführen soll:

C#:
class Form1

public Form1()
{
	initialcomponents();
	//…
	Solver solver = new Solver();

	ThreadStart TStart; 
    	TStart = new ThreadStart(solver.Start); 
    	Thread firstThread = new Thread(TStart);

    	// Thread starten 
    	firstThread.Start();
}
hier ein Auszug aus der Klasse Solver:
C#:
class Solver

public Solver()
{
}

public void Start()
{
	for(int i=0; i<100;i++)
	{	
		//Berechnung durchführen
		       //…
		//Prozessbar PerformStep?
	}
}
Die Klasse Form1 besitzt die Progressbar progBar1. Diese soll durch die for-Schleife in Solver.Start() "gefüllt" (also PerformStep) werden.

Mir ist bisher nur eine Möglichkeit eingefallen, wie ich das machen könnte: Ich hätte ein Integer veröffentlicht, bei dem ein Ereignis ausgelöst wird, wenn sich sein Wert ändert. Leider kann ich nirgends finden, wie ich ein solches Ereignis definiert werden kann.
Ich habe aber auch das Gefühl, dass es wohl für dieses Problem noch eine andere Lösung geben wird. Die Beispielen, die ich bisher gefunden habe, sind jedoch recht kompliziert und für mich schwer nachzuvollziehen.

Kann mir bitte jemand eine verständliche Hilfestellung geben?
 

Turri

Erfahrenes Mitglied
Hallo,

du kannst es so machen:
C#:
    class Solver
    {
        Form1 myform = null;
        public Solver(Form1 form)
        {
            this.myform = form;  // damit man die form im Thread ansprechen kann.
        }

        public void Start()
        {
            for (int i = 0; i < 100; i++)
            {
                this.myform.PerformProgressOnForm();
                Thread.Sleep(1000);
            }
        }
    }

Der Kniff ist dann diese Funktion in der Form1 Klasse.
Da musst du mit Invoke arbeiten, damit du auf die Elemente der Form zugreifen kannst aus einer fremden Thread heraus.
C#:
        public void PerformProgressOnForm()
        {
            Invoke(new MethodInvoker(delegate()
                {
                    this.progBar1.PerformStep();
                }));
        }

Deine Solver Klasse legst du dann so an im Konstruktor der Form:
C#:
Solver solver = new Solver(this);
 
Zuletzt bearbeitet: