Chcę zaimplementować przerywane zadania na podstawie wątków tła. Jaki jest najczystszy sposób wdrożenia metody TTask.Stop
? Jak mogę przerwać wątek tła?Przerwać wątek?
Kod wykonywany w kontekście wątku jest przekazywany do zadania przy użyciu metody anonimowej i może zawierać wywołania blokujące, więc nie mogę polegać na tym, że flaga Terminated
jest regularnie sprawdzana z poziomu kodu.
Dzięki za wszelkie dane wejściowe.
Korzystanie D2010 w przypadku jest to ważne (niektóre rzeczy w TThread
wydają się zmieniły)
To jest dobra (+1) odpowiedź; cf. Python threading, w którym wiele jest zrobione z Global Interpreter Lock, który jest odpowiedzialny zarówno za bezpieczeństwo wątków (dobre), jak i na wszelkie praktyczne potrzeby ogranicza wielowątkowy kod do pojedynczego rdzenia (zły). Najlepszym rozwiązaniem tego problemu jest nie używanie wątków, lecz raczej procesów za pomocą pakietu wieloprocesowego, a także to, co zyskuje ta natychmiastowa zdolność skalowania na wielu komputerach, co w końcu staje się konieczne do dużego skalowania. Zamiast martwić się o bezpieczeństwo wątków, lepiej byłoby mieć łatwe (łatwiejsze) zarządzanie wieloprocesowe w Delphi. –
Semafory nie mają stanu "porzucony", ponieważ nie mają wbudowanego pojęcia własności. (Jeśli chodzi o system operacyjny, wątek nie może "utrzymać" semafora.) Tylko muteks może zostać porzucony w sposób wykrywalny. –
To może być dobry sposób implementacji zadań przerywalnych z blokowaniem kodu, jednak nie widzę, jak należy zaimplementować funkcjonalność w pytaniu (przerywalne zadanie dla metod anonimowych) w Delphi. Musiałby istnieć kompilator środowiska wykonawczego, aby utworzyć plik wykonywalny (który będzie tworzony jako inny proces) z anonimowej metody, nie? – mghie