Nachdem ich bei mir einen 2. thread eingebaut habe braucht das Proggi für die selbe Aufgabe plötzlich ca. 3 mal solang!
Was ich bisher mithilfe der Stopwatch rausfinden konnte war das der aufruf hier:
public string t_hauptfeld_text
{
...
set
{
if( m_hauptfeld.InvokeRequired )
{
m_hauptfeld.Invoke( new setDelegate( delegate { m_hauptfeld.Text = value; } ) );
}
else
{
m_hauptfeld.Text = value;
}
}
}
auch mehrmals solang braucht wenn ein extra Thread benutzt wird wie wenn alles in einem Thread läuft!
Auch mit der folgenden Lösung hab ich dasselbe Problem:
private delegate void setStringDelegate( string t_string );
private setStringDelegate sStrDel;
sStrDel = new setStringDelegate( delegate( string t_string ) { m_hauptfeld.Text = t_string; } );
public string t_hauptfeld_text
{
...
set
{
if( m_hauptfeld.InvokeRequired )
{
m_hauptfeld.Invoke( sStrDel, value );
}
else
{
m_hauptfeld.Text = value;
}
}
}
Wisst ihr alternative oderr habt ihr sonst Ideen wie ich das ganze beschleunigen kann?
Gruß Muphin
Hallo Muphin,
könnte es evtl. daran liegen, dass mehrere Threads die gleiche Variable setzen möchten?
Verwende am besten ein Locking.
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
eigentlich nicht, da ich zumindest jetzt beim testen nur durch einen Button Click eine Methode aufgerufen hab die eben jetzt in einem eigenen Thread laufen soll! Sonst passiert nichts weiter! Ich will halt dass das Control immer aktuell bleibt, deshalb setze ich den Thread ein!
private void btn_komplettLoesen_Click(object sender, System.EventArgs e)
{
if (m_neueZahlen)
{
setzeOriginalArray();
m_neueZahlen = false;
}
else
{
setzeZahlenArray();
}
Thread a_loeseThread = new Thread( new ThreadStart( loese ) );
a_loeseThread.Start();
//loese();
}
Hallo Muphin,
jeder Aufruf von Control.Invoke führt zu zwei Thread-Wechseln. Da ein Thread-Wechsel im Vergleich zum Setzen einer Property eine relativ aufwändige Geschichte ist, ist es gut möglich, dass die Laufzeit um ein Vielfaches steigt.
In [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) steht:
In einer Methode, die man mit Control.Invoke/BeginInvoke aufruft, können mehrere Zugriffe auf Controls erfolgen. Man muss also nicht für jeden einzelnen Zugriff eine einzelne Methode schreiben, sondern kann Zugriffe zusammenfassen.
Man könnte noch ergänzen: Und man sollte die Zugriffe auch zusammenfassen, wenn insgesamt viele Zugriffe zu erwarten sind, weil sonst die Laufzeit explodieren kann.
herbivore
okay, danke, das klingt absolut logisch!
Nur wenn ich jetzt sozusagen die übergeordnete Methode mit invoke aufrufe wird ja wiederum dieser ganze code im ursprünglichen Thread aufgerufen womit bei mir wiederum das problem mit dem control aktualisieren auftritt!
D.h. mir bleibt wohl nichts anderes übrig wie einen geeigneten zwischenweg zu finden!?
Gruß Muphin
Hallo Muphin,
richtig, wenn du alle Zugriffe in eine Methode packst und die mit Control.Invoke aufrufst, dann blockiert dein GUI. Aber wenn du jeden einzelnen Zugriff in eine Methode packst und die jeweils mit Control.Invoke aufrufst, dann explodiert die Laufzeit. Also musst zu soviele Zugriffe wie möglich in eine Methode packen, aber so wenig wie nötig, damit die Laufzeit der Methode unter 1/10s bleibt und damit das GUI nicht blockiert.
herbivore