mikrocontroller.net

Forum: PC-Programmierung c# Threadübergreifende Zugriffe


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo NG,

ich "spiele" gerade ein wenig mit C#. Was ich gerne machen möchte:
Ein Button startet einen neuen Thread, der wiederum z.B. im Mainform 
irgendwas anstellt (denkbar wäre ein Statustext, oder ein 
Fortschrittsbalken.). Ich will das hier bewußt nicht über einen 
"BackgroundWorker" machen.

Jetzt habe ich mir schon ein kleines Testprojekt zusammengebastelt, wo 
ein Thread den Statusbalken im Mainfrom mit 100 Zufallswerten versorgt 
und ganz viel zählt, um auch etwas zu tun zu haben. Ich habe bewußt auf 
System.Threading.Thread.Sleep verzichtet, da ich nicht genau weiß, ob 
meine Frage damit zu tun hat :-)

Was mir jetzt gar nicht gefällt ist: Wenn ich das Fenster während des 
Laufenden Tasks bewege, dann scheint auch der Thread (Ihr wisst schon - 
der mit den vielen Zahlen) zu "schlafen". Ich würde gerne wollen, dass 
der Thread weiterarbeitet (der Balken springt) während ich das Fenster 
bewege, vergrößere oder was auch immer.

Wäre echt cool, wenn mir jemand sagen könnte, woran das hier liegt. Ich 
könnte mir vorstellen, dass der Thread an dem gleichen hängt, wie das 
Fenster (keine Ahnung). Wenn ja - wie kann man das ändern?

Hier mal mein Test:

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;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Thread t = new Thread(new ThreadStart(aufgabe));
            t.Start();

        }

        private void aufgabe()
        {
            if (this.InvokeRequired == false)
            {
            }
            else
            {
                Del handler = DelegateMethod;
                Invoke(handler);
            }
        }

        public delegate void Del();

        public void DelegateMethod()
        {
            for (int i = 0; i < 100; i++)
            {
                Random r = new Random();
                progressBar1.Value = r.Next(100);
                for (int j = 0; j < 10000000; j++)
                {

                }
                Application.DoEvents();
            }
        }
    }
}

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wäre echt cool, wenn mir jemand sagen könnte, woran das hier liegt. Ich
> könnte mir vorstellen, dass der Thread an dem gleichen hängt, wie das
> Fenster (keine Ahnung). Wenn ja - wie kann man das ändern?

Das Problem ist, dass der Thread als erstes mit Invoke eine Methode 
aufruft, die genau dazu gedacht ist, UI-Updates im Hauptthread 
durchzuführen. Wenn der Hauptthread nun das Fenster neuzeichnet...
Dreh das ganze mal um
       public delegate void Del(int v);

        private void aufgabe() {
            Del handler = DelegateMethod;
            Random r = new Random();
            for (int i = 0; i < 100; i++) {
                Invoke(handler, new Object[] { r.Next(100) });
                for (int j = 0; j < 10000000; j++) {
                 }
            }
        }
        public void DelegateMethod(int v) {
            if (progressBar1 == null) return;
                progressBar1.Value = v;
                progressBar1.Update();
            }
        }

p.s. wenn das Programm beendet wird, bevor der Thread beendet ist/wird, 
wird es abstürzen (ObjectDisposedException)...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Arc!

das funktioniert ja 100%. Ich bin echt begeistert. Vor allem denke ich, 
dass ich etwas gelernt habe :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.