Temat: Zamrażanie formy podczas wykonywania dużego...
Może robisz Open na query w synchronizowanej metodzie wątka? Wtedy zapytanie i tak jest wykonywane przez główny wątek aplikacji więc nic to nie zmienia. Ważne jest aby Open wołać bezpośrednio w procedurze TThread.Execute lub w innej "niesynchronizowanej" procedurze wołanej przez Execute.
Kiedyś miałem podobny problem i w skrócie rozwiązałem go tak:
1. Przed odświeżeniem grida odpinam od niego datasource (jeszcze przed uruchomieniem wątka)
2. Odpalam wątek i w execute wołam Open na query.
3. Zaraz po Query.Open podpinałem ponownie datasourca do grida aby wyświetlić wynik poprzez Synchronize(ProceduraPodpinajacaGrida)
Uwagi:
We wszystkich tutorialach o wątkowaniu zapytań do bazy jakie czytałem, jest napisane, że jeżeli wykonujemy zapytanie w wątku to ów query powinno mieć własne osobne połączenie z bazą danych w ramach tego wątka. Mimo wszystko powyższy sposób mi działał ale pewnie dlatego, że w trakcie tego zapytania nie wykonywałem żadnych dodatkowych zapytań w głównej aplikacji. Podejrzewam, że jeżeli wykona się dodatkowe zapytanie do bazy w głównym wątku jeżeli trwa pobieranie danych w wątku pobocznym to dojdzie do zakleszczenia (oba skorzystają z tego samego połączenia) i aplikacja się wywali.