Ich führe eine Berechnung in einem Thread aus, die ein außerhalb des Thread definiertes Array bearbeitet, und zwar so: Ist eine Teil-Berechnung fertig, rufe ich in der OnTerminate-Ereignisprozedur des Thread eine Prozedur im Hauptthread auf, die
1. Die berechneten Daten aus dem Array auswertet und in eine Datei speichert
2. den gleichen Thread mit neuen Berechnungsparametern erneut startet
wodurch sich ein Berechnungskreislauf ergibt, so dass die Anwendung ständig beschäftigt ist.
Es passiert nun nach einigen Stunden fehlerfreien Ablaufs, dass das Programm ohne Fehlermeldung stehenbleibt, anscheinend, weil die max. von Windows verwaltbare Threadanzahl überschritten wurde. Es lässt sich jedenfalls in diesem Zustand keine andere Anwendung mehr starten.
Jetzt habe ich von m_junglas im Thema "Programmabsturz! Warum?" gelernt, dass der Thread nach OnTerminate keineswegs schon beendet ist und man keinen Einfluss darauf hat, wann Windows nun gedenkt, ihn wirklich zu beenden. Dass das wirklich so ist, sieht man auch, wenn man in der OnTerminate-Ereignisprozedur "WaitFor" verwendet - Das Programm steht dann ab da und wartet quasi auf sich selbst. Wenn das also so ist, ist OnTerminate für mich unbrauchbar, denn ich will ja den Thread quasi aus der OnTerminate-Ereignisprozedur heraus neu starten (eigentlich ein Wunder, dass das Programm erst nach Stunden, d.h. nach einigen Tausend Berechnungs-Zyklen, stehenbleibt). Also hier beißt sich die Katze in den Schwanz, denn in der OnTerminate-Ereignisprozedur darf ich den Thread auch nicht beenden, wie schon m_junglas feststellte, andererseits will ich den Hauptthread auch nicht ständig prüfen lassen, ob der Thread noch läuft, so ähnlich wie NicoDE im Thema "
Unit in Thread packen?!" vorschlug...:
while not CalculationTerminated do Application.ProcessMessages(); // Solange die
GUI reagieren lassen
...denn ich brauche den Prozessor ja für die Berechnung.
Ich brauche also, im Gegensatz zu OnTerminate, das Ereignis, wann der Thread WIRKLICH von Windows beendet wurde. Delphi erkennt das ja anscheinend auch, wie man im Debugfenster "Threads" sehen kann.
Weiß einer, wie man's macht?
Zusatzfrage: Wie ändere ich eigentlich die Priorität des Haupt-Thread einer Anwendung?