Eclipticon hat geschrieben:Warum sollte es da einen Unterschied machen, ob ich es 1x oder 1001x aufrufe?
Macht es nicht.
Es kommt auf die maximale Zeit zwischen zwei Aufrufen an. Wenn Du in den externen Code kein ProcessMessages einbauen kannst (z.B. weil es eine DLL oder eine C-Funktion ist), hilft es nur, den externen Code in einem Thread aufzurufen. Und das wiederum ist nur erlaubt, wenn der Code im Thread keine Oberflächen-Aktionen macht (wie z.B. Progress-Bar).
Wenn Du Meldungen vom Thread an den MainThread brauchst, die z.B. ein ProgressBar bewegen, machst Du das am besten mit Application.QueueAsyncCall().
Um den Thread abzubrechen, muss der regelmäßig eine Variable, die vom Mainthread gesetzt wird (vorgesehen dafür ist TThread.Terminated) pollen und sich wenn nötig selbst beenden (seine Hauptschleife verlassen).
Der Mainthread muss dann wiederum z.B. mit TThread.WaitFor warten, ob der Thread auch wirklich beendet ist, bevor er z.B. die Applikation schließen darf.
Während TThread.WaitFor hängt natürlich die Oberfläche, da der Mainthread ja wartet (was er eigentlich nie machen sollte). Deshalb kann es bei möglicherweise langer Wartezeit geschickt sein, den Thread nach der Hauptschleife vor der tatsächlichen Beendigung (z.B. mit Application.QueueAsyncCall() oder TThread.Synchronize() ) eine Mitteilung an den Mainthread schicken zu lassen, damit der so lange noch arbeiten kann (z.B. irgendwas anzeigen).
-Michael