Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Multithreading - Threads laufen hintereinander ab [==> weil alles an den GUI-Thread delegiert wird]
banax
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

Multithreading - Threads laufen hintereinander ab [==> weil alles an den GUI-Thread delegiert wird]

beantworten | zitieren | melden

Hallo,

ich sitze vor meiner zweiten Anwendung mit Multithreading. Habe zwei Threads erstellt und diese starten auch. Nur leider nicht gleichzeitig, sondern hintereinander. Kann mir da jemand helfen? Hier der Code, mal abgesehen davon das der nicht grade sauber geschrieben ist. Mir gings nur um das Multithreading erstmal.

Hab da schon durch ein paar Bücher geblättert und gegoogelt aber irgendwie ..... !

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Ziffernanimation
{
    public partial class onedigit : UserControl
    {
        int value1 = 0;
        int value2 = 0;
        int pos1 = 0;
        int pos2 = 0;
        public onedigit()
        {
            InitializeComponent();
        }

        private void onedigit_Load(object sender, EventArgs e)
        {

        }

        Thread worker1;
        Thread worker2;
        int val1;
        int val2;
        public void setValue(int val_)
        {
            val1 = val_ / 10;
            val2 = val_ % 10;
            worker1 = new Thread(doit1);
            worker2 = new Thread(doit2);
            worker1.Start("d");
            worker2.Start("r");
        }

        private void doit1(object inputData)
        {
            this.Invoke(new MethodInvoker(make1));
        }

        private void make1()
        {
            if (val1 > value1)
            {
                int schritte = val1 - value1;
                for (int i = 0; i < schritte * 10; i++)
                {
                    pos1 = pos1 - 5;
                    panel1.Location = new System.Drawing.Point(0, pos1);
                    System.Threading.Thread.Sleep(10 / schritte);
                    this.Refresh();
                }
                value1 = val1;
            }
            else if (val1 < value1)
            {
                int schritte = value1 - val1;
                for (int i = 0; i < schritte * 10; i++)
                {
                    pos1 = pos1 + 5;
                    panel1.Location = new System.Drawing.Point(0, pos1);
                    System.Threading.Thread.Sleep(20);
                    this.Refresh();
                }
                value1 = val1;
            }
        }


        private void doit2(object inputData)
        {
            this.Invoke(new MethodInvoker(make2));
        }

        private void make2()
        {
            if (val2 > value2)
            {
                int schritte = val2 - value2;
                for (int i = 0; i < schritte * 10; i++)
                {
                    pos2 = pos2 - 5;
                    panel2.Location = new System.Drawing.Point(50, pos2);
                    System.Threading.Thread.Sleep(10 / schritte);
                    this.Refresh();
                }
                value2 = val2;
            }
            else if (val2 < value2)
            {
                int schritte = value2 - val2;
                for (int i = 0; i < schritte * 10; i++)
                {
                    pos2 = pos2 + 5;
                    panel2.Location = new System.Drawing.Point(50, pos2);
                    System.Threading.Thread.Sleep(20);
                    this.Refresh();
                }
                value2 = val2;
            }
        }
    }
}

Vielen Dank
Gruß
banax
private Nachricht | Beiträge des Benutzers
thomas.at
myCSharp.de - Member



Dabei seit:
Beiträge: 102
Herkunft: Österreich / Wien

beantworten | zitieren | melden

Hallo

Da hast Du das mit dem Invoke noch nicht ganz verstanden. Wenn Du Invoke aufrufst, dann wird das wieder im Hauptthread ausgeführt. In Deinem Beispiel bedeutet dies, das Du den Thread "doit1" startest und dann sofort wieder das "make1" in der GUI ausführst. Erst wenn dies fertig ist, dann geht es mit "doit2" weiter. Starte direkt "make1" und "make2" und verlagere die Verschiebung des Panels mittels Invoke in die GUI.

mfG
Thomas
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

Hallo,

die Aufgaben beider Threads delegierst Du mit this.Invoke wieder den Gui Thread. Und der kann nur eine Sache zur gleichen Zeit machen. Du müsstest die Invokes besser genau zu den Stellen bringen wo Du auf die Gui zugreifst.. Dh. in die Schleifen, dann wirds klappen.

Ist im Prinzip das gleiche was in [FAQ] Warum blockiert mein GUI? beschrieben wird, nur das bei Dir nur ein Panel einfriert.
private Nachricht | Beiträge des Benutzers
banax
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

Aaah...perfekt, danke. Das klingt logisch. Jetzt weiß ich wie ich das machen muss. Danke
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (16.10.2013 - 08:31:52):

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1 und 4.a.