TThread und Perfomance des Gesamtprogramms
-
Hallo zusammen,
kann mir jemand sagen, ob ein neuer Thread die Laufzeit und Geschwindigkeit des Programmes in erheblichen Maße beeinflusst?
Wer das Tutorial hier im Forum über TThread's gelesen und getestet hat, weiß sicherlich worauf ich hinaus möchte.
Ich habe den Anschein, dass mein Programm wesentlich langsamer verfährt, wenn ich einen zusätzlichen Thread aufmache. Diesen benötige ich allerdings, da mein Programm mehrere Minuten rechnet.
Kann man diesen Nachteil irgendwie kompensieren?
Danke
StefanN
-
Hallo,
ich habe jetzt den Verdacht, dass meine Performance schlecht ist, da ich insgesamt 2 neue Threads erzeugt habe und die Synchronisation zwischen beiden nicht hinhaut.
Ich habe einen HauptThread.
Mein zweiter Thread führt Berechnungen aus, die sehr lange andauern können. Die Zwischenergebnisse auf Formular1 (HauptThread) wird mit der Funktion 'Synchronize' und Member-Variablen erledigt. Ich denke das funktioniert.Der Nutzer gibt bei mir eine Rechenzeit ein. Über eine Progressbar möchte ich nun die restliche Dauer auf Formular1 angeben. Da es vorkommen kann, dass ich mich im zweiten Thread in einer Funktion sehr lange befinde, dachte ich mir, einen dritten Thread im zweiten Thread zu starten, der die ProgessBar im Formular1 füllt. Den dritten Thread habe ich eröffnet, damit die ProgressBar kontinuierlich gefüllt wird, und nicht im zweiten Thread mal 10 Prozent mal 5 Prozent und mal 20 Prozent auf einen Schlag hinzukommen.
Leider funktioniert jetzt meine Synchronisation im dritten Thread mit dem zweiten Thread nicht mehr.
--------------------------------------------------------------------------------
Zusammenfassend:HauptThread: Normales Formular (Formular1)
Zweiter Thread: Führt Berechnungen aus und gibt Zwischenergebnisse auf Formular1 aus.
Dritter Thread: Sollte stetig die ProgressBar in Formular1 füllen.Gibt es eine einfache Möglichkeit auf diesen Thread zu verzichten und es im HauptThread ausführen zu lassen, ohne dass mir das Formular einfriert?
Oder kann man die drei Threads sauber miteinander synchronisieren?
Danke und Liebe Grüße
StefanN
-
Hallo,
die Synchronisation, ist genau dein Problem (also wohl eher ein Architekturproblem).
Wenn der Rechenthread rechnen könnte, ohne dass er ständig irgendwelche Zwischenergebnisse ausgeben müsste (was ja mit dem Hauptthread synchronisiert werden muss), würde das Programm flüssig weiterreagieren.Du kannst entweder multithreading machen oder synchronisieren.
-
Den dritten Thread brauchst Du gar nicht. Auf die Verwendung von Synchronize solltest Du auch verzichten. Um dennoch den Status an den Hauptthread zu übermitteln würde ich das Botschaftssystem verwenden.
Hab ich schon ein paar mal so gemacht. funktioniert prima. Vewende allerdings nicht OnMessage, sondern mach eine richtige Botschaftsbehandlung. Sonst kann es passieren, dass Botschaften nicht rechtzeitig vom Hauptthread verarbeitet werden können und verworfen werden. Auch solltest Du nicht zu viele Botschaften versenden. Eine Botschaft, alle paar Sekunden reicht vollkommen.
Auf die Ausgabe von Zwischenergebnissen würde ich komplett verzichten, zumindest aber auf ein absolutes mininmum reduzieren.
-
Hallo und danke für eure Antworten.
Ich habe jetzt eine Version des Programmes mit und ohne Ausgabe von Zwischenergebnissen geschrieben.
In beiden Fällen mache ich dennoch einen neuen Thread auf. Nur das Erzeugen eines neuen Thread geht aber nicht auf die Performance, oder doch?
Danke
StefanN
-
Nein, das ist im Regelfall kein Problem.