hallo,
ich habe heute versucht einen thread zu verlagern damit die GUI nicht mehr einfriert.
undzwar habe genau das selbe gemacht wie in diesem guide => Threading out tasks in a C#.NET GUI
private void fileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
if (System.IO.File.Exists(e.FullPath) == true)
{
Manager mgr = new Manager(e, handreader, txtLog, sl);
//sl.Invoke(new MethodInvoker(mgr.test));
//sl.Invoke(new MethodInvoker(mgr.test));
Thread mgrThread = new Thread(new ThreadStart(mgr.output));
mgrThread.Name = "ThreadSl";
mgrThread.Start();
}
}
public void output()
{
StringBuilder builder = new StringBuilder();
foreach (PlayerController pc in fm.lPc)
{
Equity eq = new Equity(pc, 100f, 0.5f, 0.3f, 0.2f, fm.HeroName);
pc.calcEquity();
Equity newEq = new Equity(pc, 100f, 0.5f, 0.3f, 0.2f, fm.HeroName);
if (newEq.getEquity(pc.getSeatByName(fm.HeroName)) != eq.getEquity(pc.getSeatByName(fm.HeroName)))
builder.Append("" + eq.getEquity(pc.getSeatByName(fm.HeroName)) + " / " + (newEq.getEquity(pc.getSeatByName(fm.HeroName)) - eq.getEquity(pc.getSeatByName(fm.HeroName))) + " Result: +Ev with : " + ((eq.getEquity(pc.getSeatByName(fm.HeroName)) / ((newEq.getEquity(pc.getSeatByName(fm.HeroName))))) * 100 + "%\r\n"));
}
txtLog.Text = builder.ToString();
}
Fehlermeldung:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement txtLog erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde
Ich habe mit den post auf msdn durchgelesen How to: Make Thread-Safe Calls to Windows Forms Controls
und ich werde aufjedenfall meinen code umschreiben.
trotzdem interessiert es mich warum es nicht funktioniert, denn bei Threading out tasks in a C#.NET GUI funktioniert es anscheinend und ich kann es einfach nicht nachvollziehen.
Hallo Kantaki
Die Fehlermeldung sagt doch alles , nicht ?
txtLog.Text = builder.ToString();
Darfst du nicht im "nicht GUI" Thread machen. Ansonsten musst du erst Invoken.
(dieser Satz erinnert mich an VB : NOT NOTHING !)
Beste Grüsse
Diräkt
Hallo kantaki
Also hier in der FAQ gibts einen Artikel: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
Da steht eigendlich alles drinne, was du wissen musst.
Den Artikel auf CodeProject würde ich ignorieren. Ist imho nicht so der Stand der Technik.
Gruß, Alf
undzwar habe genau das selbe gemacht wie in diesem guide
Damit hast du wohl so ziemlich eines der schlechtesten Tutorials in diesem Gebiet erwischt...
Siehe besser den genannten [FAQ] Warum blockiert mein GUI?
Das Verlagern der langlaufenden Aktionen in einen extra Thread ist nur die halbe Miete. Es verhindert das blockieren des GUIs (siehe [FAQ] Warum blockiert mein GUI?). Wenn du aus dem Thread auf das GUI zugreifen willst, musst du eben auch noch [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) beachten (die zweite Hälfte der Miete). Das verhindert Probleme beim ansonsten thread-übergreifenden Zugriff.
Insofern gibt es aber auch überhaupt keinen Widerspruch, zwischen dem CodeProject und dem MSDN-Artikel.