[c#] Frage zu Thread's / Threading

07/14/2013 17:45 .Stefan#1
Hey Leute,

Immer, wenn ich einen Thread ausführe, "freezed" die ganze GUI. Wie kann ich das ändern ?
07/14/2013 17:46 dready#2
Wie führste ihn den aus ? :o
07/14/2013 17:53 .Stefan#3
So :

Code:
            ThreadStart t_wf_reload = new ThreadStart(wf_reload);
            Thread thread = new Thread(t_wf_reload);
            thread.Start();
Ist im Thread dann z.B

Code:
Thread.Sleep(3000);
Wird die komplette GUI gefreezed für diese Zeit. Auch für die Zeit, in der der Thread iwas machen soll.
07/14/2013 18:34 -AmA-#4
[Only registered and activated users can see links. Click Here To Register...]
07/14/2013 18:57 Kraizy​#5
Also bei mir klappt das ohne Probleme...

Quote:
Originally Posted by -AmA- View Post
[Only registered and activated users can see links. Click Here To Register...]
Nein, hör auf diesen Mist zu posten.
07/14/2013 19:12 Else#6
[Only registered and activated users can see links. Click Here To Register...]?
07/14/2013 19:39 dready#7
@Kraizy jub normal sollte das so laufen, würd ich auch sagen *kopfkratz*

DoEvents ist nen astreine Sache wenn man ne Menge Kopfweh will und in Kombination mit Threading dann endgültig sehr merkwürdig.
07/14/2013 20:26 Master674b#8
Dann wartet der GUI thread wohl auf einen Mutex der in dem andern Thread gerade locked ist.
07/14/2013 21:04 .Stefan#9
Quote:
Originally Posted by Kraizy​ View Post
Also bei mir klappt das ohne Probleme...

Nein, hör auf diesen Mist zu posten.
Bei mir iwie nicht. Die GUI wird erst weiter "ausgeführt" wenn der Thread beendet ist.

Quote:
Originally Posted by Master674b View Post
Dann wartet der GUI thread wohl auf einen Mutex der in dem andern Thread gerade locked ist.
Mutex :o ?

Also ich habe die Thread's erstellt in der Main_Load intizialisiert. Ist das richtig ?

€ : Habe ich z.B nur "Thread.sleep(10000) " in der Methode, funktioniert das ganze. Soll er aber nach den 10 Sekunden den Text eines Label's ändern, bekomme ich wieder den Fehler mit dem Threadübergreifenden Zugriff. Also mache ich was mit den Invokes falsch.

Bei mir sieht das bisher so aus :

Code:
            if (InvokeRequired)
            {
                BeginInvoke(new MethodInvoker(my_Method));
            }
            else
            {
            }
07/14/2013 22:08 -AmA-#10
Code:
label.Invoke((MethodInvoker)(() => label.Text = "Hier ist Text"));
07/14/2013 22:16 .Stefan#11
Quote:
Originally Posted by -AmA- View Post
Code:
label.Invoke((MethodInvoker)(() => label.Text = "Hier ist Text"));
Code:
Zusätzliche Informationen: Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.
07/14/2013 22:46 Kraizy​#12
Steht ja da, du versuchst auf dein Label zuzugreifen, bevor es überhaupt existiert.
07/15/2013 08:24 Shawak#13
Ansonsten schau dir doch einfach mal die neue Tasks Klasse an -> [Only registered and activated users can see links. Click Here To Register...]
07/15/2013 10:53 .Stefan#14
Quote:
Originally Posted by Shawak View Post
Ansonsten schau dir doch einfach mal die neue Tasks Klasse an -> [Only registered and activated users can see links. Click Here To Register...]
Danke für den Tipp ! Das klappt mitlerweile ganz gut. Das einzigste Problem, das noch besteht ist, dass die UI ( bzw. GUI ) freezed während :

Code:
Thread.Sleep(2000);
07/15/2013 11:07 tolio#15
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