[Java][AWT] Zablokowany interfejs GUI w trakcie animacji

Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[Java][AWT] Zablokowany interfejs GUI w trakcie animacji

Post autor: musialmi »

Zrobiłem sobie program z GUI (z AWT, ale to chyba nieważne) i jest w nim kręcąca się grafika. Grafika kręci się tak, że na początku jest zadany kąt obrotu i=0, jest pętla while(i<2*pi) i co jedno przejście pętli kąt się troszkę zwiększa. Obrót zachodzi, ale problem jest taki, że dopóki grafika nie przestanie się obracać, to żadne przyciski nie działają. Wniosek mój jest taki, że takich obrotów nie można robić z użyciem pętli, bo to zużywa dużo mocy komputerowi. Więc jak można?
Ostatnio zmieniony 12 cze 2016, o 08:42 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[Java][AWT] Zablokowany interfejs GUI w trakcie animacji

Post autor: Afish »

Wniosek jest taki, że takich rzeczy nie oblicza się na wątku obsługującym interfejs, tylko używa się osobnego.
Awatar użytkownika
musialmi
Użytkownik
Użytkownik
Posty: 3466
Rejestracja: 3 sty 2014, o 13:03
Płeć: Mężczyzna
Lokalizacja: PWr ocław
Podziękował: 382 razy
Pomógł: 434 razy

[Java][AWT] Zablokowany interfejs GUI w trakcie animacji

Post autor: musialmi »

Dużo zachodu jest z napisaniem i obsługiwaniem tego? To zaawansowana metoda?
Aterwik
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 15 kwie 2015, o 19:08
Płeć: Mężczyzna
Lokalizacja: Kujawsko-Pomorskie
Podziękował: 3 razy
Pomógł: 4 razy

[Java][AWT] Zablokowany interfejs GUI w trakcie animacji

Post autor: Aterwik »

Problemem nie polega na tym, że pętla zużywa komputerowi dużo mocy. Problemem jest to, że używając pętli, próbujesz wykonać cały obrót za jednym zamachem, nie dając programowi szansy na wykonanie operacji odpowiadających za obsługę interfejsu.
Twój program powinien działać mniej więcej wg. takiego schematu:

Kod: Zaznacz cały

while(i <2*pi){
      obsłuż_eventy();
      wykonaj_częściowy_obrót();
      odśwież_widok();
}
Wtedy pomiędzy każdym z częściowych obrotów program sprawdzi, czy na przykład został wciśnięty jakiś przycisk, i obsłuży go, a dopiero potem kontynuuje obracanie.
Alternatywnie, tak jak napisał Afish, możesz też rozwiązać ten problem używając wątków. Działa to w uproszczeniu na takiej zasadzie, że instrukcje w różnych wątkach wykonują się równocześnie, niezależnie od siebie. W swoim programie możesz stworzyć sobie drugi wątek, który będzie wykonywał animację grafiki, podczas gdy pierwszy będzie w tym samym czasie obsługiwał interfejs. Nie jest to jakoś specjalnie zaawansowane i trudne, obecnie w prawie każdym programie używa się wątków. Poczytaj sobie o wątkach(ang. threads) w Javie.
ODPOWIEDZ