@Patryk27: pozwolisz że zamienię komentarz na zwykłą odpowiedź bo może komuś się to przyda?
Jak oflagować taką sytuację wg mnie mocno zależy w jakim celu używa się wątków.
Można na szybko opisać kilka scenariuszy dlaczego używa się wątków (na 100% znajdziecie dużo innych powodów):
- ochrona przed zamrażaniem formy,
- prawdziwa praca równoległa,
- procedury szeregowe w wątkach.
Pierwszy przypadek prosty, nie uruchamiaj wątku gdy na coś jeszcze czekasz, jak już uruchomisz to w końcu dostaniesz jakiś wynik - lub błąd ale to też jest w końcu jakaś odpowiedź).
Drugi, o dziwo też prosty, uruchamiasz wątki i resztę zrzucasz na system operacyjny.
Trzeci scenariusz jednak może być mocno skomplikowany. Tak naprawdę jest to zwykłe wykonywanie kodu szeregowo ale "wciśnięte" w wątki. Wszystko jest ok, gdy następny wątek nie musi operować na danych poprzedniego lub sobie bez nich poradzi. Oczywiście są wait-y itp ale, przynajmniej w bibliotece PPL wydaje mi się że nie działają idealnie.
Ostatnio, właśni dzięki bibliotece PPL nastała duża moda na wątki i uważam że dobrze, bo programy w których się je używa działają zdecydowanie płynniej ale właśnie, nie zawsze działają dobrze.
Oczywiście, jest alternatywa, czyli zwykłe wątki. Niestety są dużo trudniejsze ale też mają dużo większe możliwości o czym wspominają koledzy.
Jako suplement (heh, suplement do postu - to chyba już przegięcie :) ) napiszę jak ostatnio walczyłem z wątkami.
Napisałem prostą aplikację FMX dla bardzo niedużej sieci sklepów. W każdym ze sklepów pracuje prościutki serwer REST z dostępem do bazy danych towarów i dokumentów zakupowych.
W sklepach pracownicy odpowiedzialni za zakupy mają prostą aplikację na androida gdzie skanują kod kreskowy towaru (są też wersje pod Windows). W odpowiedzi dostają informację ile towaru jest na innych sklepach, po ile te sklepy kupują towar i po ile sprzedają. Dodatkowo widzą także ostatnie 10 zakupów. Korzyści są niesamowite dla klienta, ale mniejsza z tym.
Idealnie pasowało mi aby poszczególne serwery pytać w wątkach, tak też to zrobiłem. Niestety - nie ma żadnych szans aby to dobrze działało. Kombinowałem w każdą stronę. Wszystko się zacinało.
Wg. mnie problemem jest Indy bo tego używa Delphi w komunikacji REST. Równoległe wywołanie kilku procedur wręcz miesza danymi miedzy sklepami. Normalnie jakby jakieś wycieki były.
Dla testu stworzyłem osobne zmienne dla każdego sklepu (bez sensu trochę) aby mieć pewność że to nie kwestia "przenikania" danych między zmiennymi w procedurach wątków. Nic nie pomogło. Zostało Indy.
No i najważniejsze, były to wątki PPL.
Oczywiście, wróciłem do procedur szeregowych i wszystko działa idealnie.
Jak już koledzy wspomnieli, nie zawsze wątki są najlepsze - niestety.