Halt, warte: Du beendest das Programm während die Threads noch laufen und wunderst dich dann das es Speicherlecks gibt? Wenn du die Threads nicht "sauber" beendest, wird der Speicher nicht freigegeben.
Hier gibt es die Variante, eine
Exception in einem Thread zu erzeugen. Nicht wirklich sauber, aber ziemlich clever.
Eine etwas saubere Lösung wäre es, dir ein TStream-Delegate zu erstellen, mit dem du die Berechnung aus einem anderem Thread stoppen kannst (durch Exceptions und/oder fehlgeschlagene Writes).
Was mich ein wenig wundert, ist dass du für die "Abschätzung" die eigentliche Berechnung ausführst und dann das Ergebnis wegschmeißt. Wenn der Benutzer sich dann entschieden hat, machst du die Kompression nochmal?
Der Compiler sowie die Hilfe sagen mir,
TThread.Resume;
sei veraltet. Allerdings erzeugt
TThread.Start;
bei mir immer eine
Exception vom Typ
EInvalidPointer
Erstellte den Thread nicht
suspended! Der Konstruktor wird immer in dem Kontext des erstellenden Threads ausgeführt. Das
Start ist damit völlig unnötig.