Tuer le thread est une solution crade, et ça ne garantit pas que les ressources seront libérées correctement.
La variable partagée vérifiée régulièrement est une solution, mais pour les raisons indiquées précédemment, il vaut mieux utiliser un mécanisme de synchronisation explicite, par exemple
un événement.
Dans le cas où il y a besoin d'une communication plus évoluée dans le sens thread UI -> thread de calcul, on peut aussi créer une file de messages pour le thread de calcul, qui fonctionne sur le même principe que celle du thread d'UI :
(attention à bien lire la partie "Remarques", il y a une race condition potentielle sur la création de la file)