Jak można napisać jakąś prostą animację oczekiwania gdy wątek główny programu jest czymś zajęty?
jak rozpoczynasz jakąś operacje wyświetlaj jakąś formę z napisem PROSZĘ CZEKAĆ...
a po zakońćzeniu po prostu ją zamykasz i tyle, możesz dodać progresbar żeby ci pokazywał postęp
np takie coś
//początek
Label1.Caption:='Trwa obliczanie..';
//obliczanie czy coś tam innego, np takie coś
for i:=0 to 65535 do
begin
// coś się robi
...
// dodawanie kropki do napisu
Label1.Caption:=Label1.Caption+'.';
// ożywianie głównego wątku żeby odśnieżył okienko itd
Application.ProcessMessages();
end;
//koniec
Label1.Capton:='Zakończono obliczanie';
albo to co zawala wątek główny wsadzić do pobocznego i z niego coś na foremce zmieniać ( pamiętać o synchronizacji trzeba )
Zajecie glownego watku jest bledem projektowania. Skoro cos wymaga obliczen czasochlonnych, powinno byc w oddzielnym watku, a prezentacje czekania mozesz zrobic zmieniajac, zgodnie z timerem, klatki animacji czegos w watku glownym.
najlepiej jak masz gdzies petle to zaladowac ikonki/bitmapy do TImgeList i potem w tej petli zmieniac wyswietlane obrazki na kolejne z listy...
@Szczawik: piszesz, ze to blad projektowania, ale wlasciwie dlaczego? co w tym zlego jesli na chwile przyblokujemy glowny watek skoro i tak w czasie pracy nie chcieli bysmy, aby nasz program wykonywal jakies inne operacje?
Problem tkwi w tym ze wykonywanie jakichkolwiek operacji na VCL-u z poziomu watku podczas gdy glowny proces jest zajety jest bardzo trudne. Mozna to zrobic chyba jedbynie bez synchronizacji. W przeciwnym razie watek bedzie czekal az proces glowny sie zakonczy. Nawet gdy wstawimy animacje w formie klipu AVI to odtwarzanie bedzie wstrzymane do czasu zakonczenia glownego watku.
Chcę stworzyć okienko z animacją, które będzie wyświetlane podczas wykonywania operacji na bazie danych. Operacje te trwają do ok pół minuty i w tym czasie nie jestem w stanie nic wyświetlić.
Może ktoś ma pomysł jak to rozwiązać?
no to chyba faktycznie najlepiej w osobnym watku to robic. a w glownym wyswietlac informacje ze zajety.
gamestone napisał(a)
Problem tkwi w tym ze wykonywanie jakichkolwiek operacji na VCL-u z poziomu watku podczas gdy glowny proces jest zajety jest bardzo trudne.
Po to wlasnie TThread ma metode Synchronize.
Obawiam się że Synchronize na niewiele sie zda, gdyż ono powoduje wywołanie kodu w kontekście wątku głównego - jeśli więc ten ma przywieche na 30s z tytułu operacji na bazie nic z tego ciekawego nie wyjdzie. Latające ptaszki można zrobić, pod warunkiem że zapytanie będzie odpalał wątek poboczny, lub opcjonalnie używasz np ADO wówczas można skorzystać z trybu asynchronicznego pobierania danych.
Pozdro
muehe =D ale to w trzecim poście to animacja z wątku głównego =D
a problemu to przecież nie ma tak naprawdę ( pomijając systemy wsadowe i inne starocie/specjalistyczne mutanty ), wystarczy robić w wątkach =]
@cimak - problemem nie jest fakt, ze jest to watek glowny; problemem jest fakt blokowania kolejki komunikatow, do ktorej trafiaja komunikaty systemowe; nie masz wtedy mozliwosci na przyklad przerwania dlugotrwalych operacji, gdy uzytkownik bedzie chcial zamknac system - program wtedy po prostu wisi. To jest blad projektowania.
no dobrze ale jesli instrukcje sa wykonywane np w petli i co jakis czas damy application.ProcessMessages; to bedzie ok, tak?
Nie, poniewaz Application.ProcessMessages nie przetwarza niektorych komunikatow (w tym, jak dobrze pamietam, rowniez WM_QUIT).
cimak napisał(a)
no dobrze ale jesli instrukcje sa wykonywane np w petli i co jakis czas damy application.ProcessMessages; to bedzie ok, tak?
Jeden z pytaczy napisał że operacja na bazie trwa pół minuty, więc tego ProcessMessages i tak byś nigdzie nie wsadził.
no to ubić problem pakując to do innego wątku i tyle =D