ProgressBar-Wert aktualisieren (Thread)

Va7e

Mitglied
Hi :)

Ich habe auf meiner Form eine ProgressBar, die ständig aktualisiert werden soll. Ich rufe über "Button1" die Klasse "Vorgang" (Habe die Namen mal geändert, damit es besser lesbar ist) auf (Methode: "Start"). Bei der Start-Methode wird ein neuer Thread erstellt und gestartet, in diesem Thread ist ein Counter gesetzt, der bei jedem Schleifendurchlauf hochgesetzt wird. Wie kann ich jetzt den Wert des Counters an die ProgressBar in der Hauptform übergeben? Es ist auf jeden Fall über diese "Delegates" möglich aber davon habe ich keine Ahnung :-(
Hat jemand ein Beispiel für mich?

MfG

Va7e
 
Die bzw. ähnliche Fragen gabs in letzter Zeit zwar mindestens 3 mal aber ich hab trotzdem mal schnell ein Beispiel zusammen gekritzelt.

Die Form
C#:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(delegate() { new Vorgang(this); }));
            thread.Start();
        }

        public void UpdateProgressBar(int val)
        {
            if (this.progressBar1.InvokeRequired)
            {
                this.progressBar1.BeginInvoke(new MethodInvoker(delegate() { UpdateProgressBar(val); }));
            }
            else
            {
                this.progressBar1.Value = val;
            }
        }
    }

Die Klasse Vorgang
C#:
public class Vorgang
    {
        public Vorgang(Form1 caller) { start(caller); }

        private void start(Form1 caller)
        {
            for (int i = 0; i < 1000; i++)
            {
                caller.UpdateProgressBar(i);
                Thread.Sleep(10);
            }
        }
    }
 
Danke für die Antwort! Ein kleines Problem habe ich trotzdem noch, ich weiß nicht, wie ich die folgende Zeile in VB.NET schreiben soll (Hätte vorher besser erwähnen sollen, dass ich damit arbeite):

Code:
this.progressBar1.BeginInvoke(new MethodInvoker(delegate() { UpdateProgressBar(val); }));
 
Ich habs mal versucht nach VB zu übersetzen.
(Meine Herren ist das eine fürchterliche Sprache)

Form
Visual Basic:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim vorgang As Vorgang = New Vorgang()
        Dim thread As Thread = New Thread(AddressOf vorgang.start)
        thread.Start(Me)
    End Sub

    Public Delegate Sub UpdateProgressBarDelegate(ByVal val As Integer)

    Public Sub UpdateProgressBar(ByVal val As Integer)
        If Me.ProgressBar1.InvokeRequired Then
            Me.ProgressBar1.BeginInvoke(New UpdateProgressBarDelegate(AddressOf UpdateProgressBar), val)
        Else
            Me.ProgressBar1.Value = val
        End If
    End Sub
End Class

Klasse Vorgang
Visual Basic:
Public Class Vorgang
    Public Sub New()
    End Sub
    Public Sub start(ByVal caller As Form1)
        For i = 0 To 1000 Step 1
            caller.UpdateProgressBar(i)
            Thread.Sleep(10)
        Next
    End Sub
End Class

Es funktioniert wie es soll aber es ist gut möglich das es auch einfacher / anders geht.
 
Hab's nicht getestet...habe den CodeConverter gefragt... aber sollte klappen so: :p
Code:
Me.progressBar1.BeginInvoke(New MethodInvoker(Function() Do
	UpdateProgressBar(val)
End Function))
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück