Niektórzy twierdzą że nie trzeba się do końca martwić uruchomionymi wątkami w trakcie zamykania aplikacji. System operacyjny teoretycznie powinien po tobie posprzątać.
nie, system nie ubije wątku i nie posprząta. Zrób test - stwórz wątek, który nigdy się nie kończy, uruchom go i potem zamknij aplikację. Uruchom menadżera zadań i zobacz, że aplikacja cały czas wisi w procesach. I będzie tak wisieć aż do restartu albo ręcznego ubicia procesu.
Ja jednak uważam że większym zmartwieniem niż wyciek pamięci jest to co robisz w takim wątku. Ja np. w wątkach staram się tylko czytać a nie zmieniać czy tworzyć jakieś dane. Nawet jak już muszę np. utworzyć jakiś rekord bo wątek tak zdecydował to raczej robię to w ten sposób że wątek powiadamia główny proces że jest taka konieczność i już on się tym zajmuje. W ten sposób zabezpieczam się przed przerwaniem np. tworzenia rekordu. Wiem, wiem, w systemach transakcyjnych i tak wszystko dobrze powinno się skończyć ale nie wszystko robi się transakcjami.
to jest jakaś bzdura - po to coś się robi w wątku, żeby nie wołać co chwilę głównego wątku. Idealnie to powinno wyglądać tak:
- stworzenie wątku i przekazanie mu wszystkich potrzebnych mu danych
- uruchomienie go (i wykonanie całego liczenia czy co tam wątek robi)
- zakończenie wątku i zwrócenie wyniku
idealnie, pkt2 nigdy nie woła głównego wątku. Tylko, że idealne sytuacje się nie zdarzają więc tych odwołań powinno być jak najmniej i w miarę możliwości nieblokujące (np. używanie PostMessage
do wysłania jakiejś informacji do głównego wątku) wątku bocznego jeśli akurat wątek główny jest zajęty.
Co do twojego problemu, może twórz listę uruchomionych wątków i w ten sposób na koniec po prostu przeleć pętlą po tych niezakończonych aby je pozabijać?
ale jaką listę? Przecież pytacz ma uchwyt do wątku, tylko że jeśli wątek skończy się wcześniej to się sam zwalnia (tak, wątek tak potrafi) a programista zostaje ze wskaźnikiem na nieistniejący już obiekt.