Thread Priorität
-
Ich habe ein Problem bei einem Programm bei dem ich die Priorität der Threads einstellen will. Um genau zu sein lasse ich zwei Threads laufen. Wenn ich die Threads selber festlege (Quellcode) dann geht es mehr oder weniger. Aber sobald ich während der Laufzeit eingeben lasse mit welcher Priorität diese laufen sollen und das über ein switch-case Konstrukt oder eine Reihe von if's jage hauts irgendwie nich mehr hin. Bsp.: Thread1 Priorität 1 (High)
Thread2 Priorität 5 (Low)
Bei diesem Beispiel passiert irgendwie jedes mal was anderes... Mal ist Thread1 schneller ma Thread2.Hier ein Stück QC, mt1 bezeichnet Thread1
if(p1==1) { mt1.Priority = ThreadPriority.Highest; } if(p1==2) { mt1.Priority = ThreadPriority.AboveNormal; } if(p1==3) { mt1.Priority = ThreadPriority.Normal; } if(p1==4) { mt1.Priority = ThreadPriority.BelowNormal; } if(p1==5) { mt1.Priority = ThreadPriority.Low; }
.
.
.
Das gleiche für Thread2.
Danach werden die beiden Threads gestartet und arbeiten folgende Methoden ab:private void ThreadProcedere1() { try { for(int i = v1; i < b1; i++) { RTBOUT.AppendText("\nThread1: "+i); //Thread.Sleep(s1); } RTBOUT.AppendText("\n\tThread1 fertig"); BT11.Enabled = true; BT11.BackColor = Color.Green; BT12.Enabled = false; BT12.BackColor = Color.Transparent; } catch(Exception s) { Console.WriteLine("1."+s+"\n2."+s.Message); } } private void ThreadProcedere2() { try { for(int i = v2; i < b2; i++) { RTBOUT.AppendText("\nThread2: "+i); //Thread.Sleep(s2); } RTBOUT.AppendText("\n\tThread2 fertig"); BT21.Enabled = true; BT21.BackColor = Color.Green; BT22.Enabled = false; BT22.BackColor = Color.Transparent; } catch(Exception s) { Console.WriteLine("1."+s+"\n2."+s.Message); } }
-
Was möchtest Du denn erreichen?
Normalerweise ist das genau der Clou, dass die Threads unabhängig voneinander laufen. Sie sollten, wenn nötig synchronisiert werden.Simon
-
Es soll hinterher einfach erkenntlich sein das der eine Thread öfter bearbeitet wird als der andere, sonst wäre es wie du es gesagt hast wirklich teilweise sinnvoller sie zu Synchronisieren was ich einem anderen Programmteil auch gemacht habe, aber mit anderen Threads.
-
Kapp.Sparda schrieb:
Bei diesem Beispiel passiert irgendwie jedes mal was anderes... Mal ist Thread1 schneller ma Thread2.
Nur um es zu erwähnen. Threadpriorität hat nichts mit der Geschwindigkeit zu tuen. Eine höhere Priorität bedeutet nur, daß der Thread-Sheduler den Thread bevorzugt behandelt, wie genau sich das auswirkt ist aber von vielen unterschiedlichen Faktoren abhängig.
Deine Beobachtung, das bei jedem Durchlauf etwas anderes passiert ist also vollkommen richtig, kein Bug, sondern erwartetes Verhalten des Thread-Shedulers.
-
Wie schon gesagt, dieses Verhalten ist normal und noch eine Kleinigkeit:
Benutze "switch" anstatt den if-Verzweigungen:
switch ( p1 ) { case 1: mt1.Priority = ThreadPriority.Highest; break; case 2: mt1.Priority = ThreadPriority.AboveNormal; break; case 3: mt1.Priority = ThreadPriority.Normal; break; case 4: mt1.Priority = ThreadPriority.BelowNormal; break; case 5: mt1.Priority = ThreadPriority.Low; break; default: mt1.Priority = ThreadPriority.Normal; break; }
sieht wesentlich schöner aus.
mfg
Hellsgore
-
Ja danke sehr, das mit dem if war halt nurn Prototyp. Den ganzen kram brauch ich fürn Schulprojekt das mir aufgehalst wurde in dem ich ein Java Applet nachbasteln muss.
Nochmal Danke
MfG Kapp.Sparda