wenn du das genau so aufrufst dann friert natürlich deine hauptform(/der thread dieser) ein und nicht der thread den du neu gestartet hast, wenn du den einfrieren willst musst es halt im kontext des neu erstellten threads aufrufen
Sorry, ich kann dir momentan nicht ganz folgen. Aber ich denke, dass ich das grundsätzlich verstanden habe, was du meinst. Wie kann ich denn das so einstellen, dass genau der Thread gestopt wird ( Thread.Sleep(2000) ) und nicht die Hauptform. Eigentlich steht. Thread.sleep ja in der Methode des Thread's :/
Zeig uns mal den gesamten Code, wo du den Thread startest etc.
Okay.
Funktioniert :
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
namespace ui_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Task t1 = new Task(Task1);
t1.RunSynchronously();
}
private void Task1()
{
label1.Text = "12";
}
}
}
Form wird erst nach den 5 Sekunden angezeigt.
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
namespace ui_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Task t1 = new Task(Task1);
t1.RunSynchronously();
}
private void Task1()
{
label1.Text = "12";
Thread.Sleep(5000);
label1.Text = "1234";
}
}
}
Hab die Task Klasse zwar noch nicht benutzt, aber allein der Name RunSynchronously sagt doch schon alles.
Okay, ich habe den Code nun geändert zu :
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ui_threading
{
public partial class Form1 : Form
{
private delegate void UpdateStatusDelegate(string status);
public void UpdateStatus(string status)
{
if (InvokeRequired)
BeginInvoke(new UpdateStatusDelegate(InnerUpdateStatus), new object[] { status });
else
InnerUpdateStatus(status);
}
private void InnerUpdateStatus(string status)
{
label1.Text = status;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Task t1 = new Task(Task1);
t1.Start();
}
private void Task1()
{
UpdateStatus("Text1");
Thread.Sleep(5000);
UpdateStatus("Text2");
}
}
}
Damit funktioniert alles soweit. Jedoch scheint mir das mit den 2 Methoden für das Label etwas aufwendig. Aber möglich. Kennt jemand bessere Methoden ?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ui_threading
{
public partial class Form1 : Form
{
private delegate void UpdateStatusDelegate(string status);
public void UpdateStatus(string status)
{
if (InvokeRequired)
BeginInvoke(new UpdateStatusDelegate(InnerUpdateStatus), new object[] { status });
else
InnerUpdateStatus(status);
}
private void InnerUpdateStatus(string status)
{
label1.Text = status;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Task t1 = new Task(Task1);
t1.Start();
}
private void Task1()
{
UpdateStatus("Text1");
Thread.Sleep(5000);
UpdateStatus("Text2");
}
}
}
Damit funktioniert alles soweit. Jedoch scheint mir das mit den 2 Methoden für das Label etwas aufwendig. Aber möglich. Kennt jemand bessere Methoden ?
geht viel einfacher:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ui_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
Label1.Text = "Text1";
Thread.Sleep(5000);
Label1.Text = "Text2";
});
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ui_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
Label1.Text = "Text1";
Thread.Sleep(5000);
Label1.Text = "Text2";
});
}
}
}
Bist du dir sicher, dass dies so funktioniert. Bei mir kommt immer noch der Fehler : Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lbl_test erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
Quote:
Originally Posted by Schlüsselbein
Okay muss ich mir näher ansehen.
Danke für die Antworten.
Ich hätte eine weitere kleine Frage : Wie kann ich eine 2. Klasse erstellen, die Methoden beinhaltet, die auch z.B Label's ändern kann ?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ui_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
this.Invoke(() =>
{
Label1.Text = "Text1";
Thread.Sleep(5000);
Label1.Text = "Text2";
});
});
}
}
}
Sollte funktionieren
Ansonsten;
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ui_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
this.Invoke(() { Label1.Text = "Text1"; });
Thread.Sleep(5000);
this.Invoke(() { Label1.Text = "Text2"; });
});
}
}
}
C++ Threading 03/01/2013 - C/C++ - 3 Replies Ich habe da mal eine frage zu Threading in C++
Wie kann ich eine Thread Array starten?
ich weiß das ich in C# es z.B. so machen kann:)
Thread myThread;
myThread= new myThread;
Threading 02/22/2013 - Nostale - 3 Replies Hi!I have a question for what i need multithreading i developing game server.Soo i know that i need this for connection.
C# Cross Threading 10/13/2012 - .NET Languages - 5 Replies I was working on Console Applications for a long time and i was able to edit the console from almost everywhere in the project; However, when i migrated to windows forms applications i wondered that i can't edit for example a textBox from any other class because it tells me some error about cross threading
So can any one help me ?
C++ Threading 03/24/2012 - CO2 Programming - 13 Replies Anybody got some good threading tutorials in c++?
#Edit
Using boost would be fine?
Threading 11/18/2011 - CO2 Private Server - 10 Replies What should I do?
A thread for every map that's used by players, a global thread for all players or a single thread for every player.