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
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
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.
Aaah...perfekt, danke. Das klingt logisch. Jetzt weiß ich wie ich das machen muss. Danke
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1 und 4.a.