Announcement

Collapse
No announcement yet.

Parallel.For & Invoke

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Parallel.For & Invoke

    Hallo,

    hier wurde mir schon einmal gut geholfen. Ich hoffe diesmal wieder. Danke.

    Kurz erklärt:
    Buttonclick leitet Event an Controller weiter, wo Parallel.For abgearbeitet wird. Pro Loop soll eine Statusinformation ans View ausgegeben werden. Leider hängt sich das Prog auf.

    Was mache ich falsch? Ich benutze das Framework 3.5. Framework 4.0 bekomme ich nicht als Zielframework in VS 2008 zur Auswahl, trotz Installation, mal so am Rande erwähnt, sonst hätt ich es noch mit dem Scheduler versucht, wie es Bsp. bei MSDN zeigen.

    Code:
    static void Main()
            {
                View view = new View();
                Controller cr = new Controller(view);
                Application.EnableVisualStyles();
                Application.Run(view);
            }
    
    public partial class View : Form
        {
            public View()
            {
                InitializeComponent();
            }
                   
            public event EventHandler Calculate;
    
            internal void OnCalculate()
            {
                EventHandler tmp = Calculate;
                if (tmp != null)
                    tmp(this, EventArgs.Empty);
            }
    
            delegate void GenericDelegate();
            
            public void UpdateLabelText(string text)
            {
                GenericDelegate dlg = delegate()
                {
                    this.label1.Text = text;
                };
                
                label1.Invoke(dlg);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                OnCalculate();
            }
        }
    
        public class Controller
        {
            private View view;
    
            public Controller(View view)
            {
                this.view = view;
                this.view.Calculate += new EventHandler(view_Calculate);
            }
    
            void view_Calculate(object sender, EventArgs e)
            {
                System.Threading.Parallel.For(0, 5, delegate(int i)
                {
                    view.UpdateLabelText(i.ToString());
                });
            }
        }
    Danke für Unterstützung.

    MFG
    sci

  • #2
    hier wurde mir schon einmal gut geholfen. Ich hoffe diesmal wieder. Danke.
    Wir danken auch.

    Bevor ich auf das eigentliche Problem eingehe will ich ein paar grundlegende Sachen klarstellen:
    Buttonclick leitet Event an Controller weiter
    In WinForms lässt sich MVC so wie du es vorhast nicht umsetzen. Per Definition ist der Controller für die Verarbeitung der Benutzereingaben zuständig. Das sind in WinForm die Ereignishandler welche die UI-Events binden. Somit verschmilzt aus Code-Seite View und Controller zu einem. Den Ansatz den du verfolgst - der auch gut ist - nennt sich Model View Presenter (MVP). Benenne als deinen Controller in Presenter um und es passt.

    delegate void GenericDelegate();
    Der Name ist ungünstig gewählt. Der Delegat hat nichts mit Generic zu tun. Für generische Delegaten siehe Generische Delegaten (C#-Programmierhandbuch)
    Ich finde es merkwürdig dass ich (täglich) mit Generics arbeite aber es mir nicht möglich ist in einem Satz zu definieren was Generics sind

    Leider hängt sich das Prog auf.
    Das ist ein Klassiker wenn Threads von unerfahrenen Benutzern verwendet werden (nicht böse gemeint - den Fehler hab ich auch mal gemacht).
    Wie korrekt von Threads auf UI-Elemente zugegriffen wird zeigt Gewusst wie: Threadsicheres Aufrufen von Windows Forms-Steuerelementen
    Ergänzende Information: Mit Application.Run() wird der UI-Thread gestartet. Alles was mit UI zu tun ist ausschließlich in diesem Thread. Bei nicht-UI-Threads könne die Felder/Eigenschaften threadübergreifend manipuliert werden. Nicht jedoch beim Zugriff eines Threads auf den UI-Thread.


    mfG Gü

    Persönliche Anmerkung die nicht auf dich persönlich abziehlt:
    Genau das hab ich befürchtet: Mit .net 4.0 ist es für jeden möglich Parallelverarbeitung durchzuführen ohne dass die grundlegenden Kenntenisse von Threading existieren. Dieses und weitere solcher Probleme werden in Zukunft immer öfter auftreten das es sehr verlockend und als Hype gilt mit mehreren Threads zu arbeiten. Ich bin dennoch der Meinung dass dieses Werkzeug nur dann sinnvoll eingesetzt werden kann wenn die Grundlagen wie zB Threadsynchronisation verstanden werden - auch wenn das Werkzeug viel von den Mechanismen die im Hintergrund tätig sind wegabstrahiert. Ich habe zB noch keinen Artikel über das Task-Parallel-Library gesehen der darauf eingeht welche Problem sich parallelisieren und nicht parallelisieren lassen.
    Es ist gut zu überlegen ob die zu verarbeitenden Daten unabhängig voneinander sind - nur dann ist eine Parallelisierung möglich.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Fortsetzung: http://entwickler-forum.de/showthread.php?t=57101


      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment

      Working...
      X