Laden...

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

Erstellt von banax vor 10 Jahren Letzter Beitrag vor 10 Jahren 972 Views
Thema geschlossen
B
banax Themenstarter:in
29 Beiträge seit 2009
vor 10 Jahren
Multithreading - Threads laufen hintereinander ab [==> weil alles an den GUI-Thread delegiert wird]

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

T
111 Beiträge seit 2005
vor 10 Jahren

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

849 Beiträge seit 2006
vor 10 Jahren

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.

B
banax Themenstarter:in
29 Beiträge seit 2009
vor 10 Jahren

Aaah...perfekt, danke. Das klingt logisch. Jetzt weiß ich wie ich das machen muss. Danke

Hinweis von herbivore vor 10 Jahren

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

Thema geschlossen