Animacja oczekiwania

0

Jak można napisać jakąś prostą animację oczekiwania gdy wątek główny programu jest czymś zajęty?

0

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

0

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 )

0

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.

0

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?

0

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.

0

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ć?

0

no to chyba faktycznie najlepiej w osobnym watku to robic. a w glownym wyswietlac informacje ze zajety.

0
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.

0

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

0

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 =]

0

@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.

0

no dobrze ale jesli instrukcje sa wykonywane np w petli i co jakis czas damy application.ProcessMessages; to bedzie ok, tak?

0

Nie, poniewaz Application.ProcessMessages nie przetwarza niektorych komunikatow (w tym, jak dobrze pamietam, rowniez WM_QUIT).

0
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ł.

0

no to ubić problem pakując to do innego wątku i tyle =D

1 użytkowników online, w tym zalogowanych: 0, gości: 1