Wątki, wątki, wątki - wykonywanie w kolejce

0

Witam wszystkich :)

Piszę projekt i utknąłem na dobre w jednym punkcie. Chciałem sobie poradzić samodzielnie, ale teraz widzę, że chyba nie dam rady :/

A więc tak mam wątek który odtwarza fragment muzyki 10sekundowej (poprzez

watek1

) i chcę żeby był zapętlony do momentu wciśnięcia przycisku buttStop

.

Próbowałem na różne sposoby, ale żadne nie działają :(. Dodam, że jeżeli wątek1 podpiąłem pod button1 i naciskam go co 10 sekund, to działa tak jak trzeba, ale w pętli nie idzie:/

Poratuje ktoś? Bo projekt niedługo do oddania, a ja jestem w kropce, z góry ogrooomne dzieki!
0

W wątku odtwarzanie w pętli repeat, w warunku sprawdzana jakaś zmienna logiczna (niech będzie static, będzie Ci łatwiej), w przycisku ustawiana wartość tej zmiennej na false. Oczywiście musisz zresetować wartość tej zmiennej na true przed rozpoczęciem pierwszego odtwarzania w pętli przez wątek.

PS Wiesz co po polsku znaczy "butt"? ;-) Jako skrót od "button" przyjęło się mniej niefortunne "btn".

0
ŁF napisał(a):

W wątku odtwarzanie w pętli repeat, w warunku sprawdzana jakaś zmienna logiczna (niech będzie static, będzie Ci łatwiej), w przycisku ustawiana wartość tej zmiennej na false. Oczywiście musisz zresetować wartość tej zmiennej na true przed rozpoczęciem pierwszego odtwarzania w pętli przez wątek.

Mógłbyś objaśnić, zarysować kod?
Bo próbowałem to zrobić tak, sytuacja w wątku:

while(true)
{
	music.play();
}

Zaś przy wywołaniu wątku:

boolean petla = true;
			while(petla)
			{
			   watek1.start();
			}

A orzy klawiszu petla = false. Ale to nie działa w ogóle :/ Proszę bardzo o pomoc.

0

Bo używasz zmiennej lokalnej zamiast pola klasy. Dokształć się z podstaw, bo się nie dogadamy.

0
ŁF napisał(a):

Bo używasz zmiennej lokalnej zamiast pola klasy. Dokształć się z podstaw, bo się nie dogadamy.

No właśnie ŁF podstawy mam dobrze opanowane i to nie w tym problem. Zmienna jest globalna!

Zagłębiłem się nieco w implementacje i nie działa dlatego, że metoda play() działa tak, że od razu odpala muzykę i niezależnie od jej stanu przechodzi natychmiast dalej, dzięki czemu nie można po prostu uruchomić czegoś np. takiego.

music.play();
music.play();

Dodam, że Thread.sleep(10000) pomiędzy też nie działa. Natomiast jeżeli wywołamy ręcznie (przez przycisk) funkcję play() poczekamy na zakonczenie i znowu play() to działa. I co teraz? Mój wątek z niewadomoych powodów wylądował w początkujących, a mam wrażenie, że nie jest on wcale prosty, no chyba, że ŁF się mylę?

0

Jakiej klasy obiektem jest music? Podczep się pod zdarzenie zakończenia odtwarzania i jeśli owa zmienna bool jest true to rozpocznij w nim odtwarzanie od nowa.

PS Temat wylądował w newbie, bo użycie zmiennej do kontrolowania wątku to są podstawy. Nie napisałeś, że problemem jest samo zapętlenie odtwarzania :/

0

Do tego celu idealnie nadają się egzekutory :

ExecutorService executor = new ScheduledThreadPoolExecutor();

executor.scheduleAtFixedRate(tutaj wątek, start po określonym czasie, odstęp między kolejnymi wywołaniami,TimeUnit <-- sekundy,minuty,godziny itd.)
0

Nie. Idealnie do tego nadaje się rozpoczęcie kolejnego odtwarzania w momencie zakończenia poprzedniego poprzez oprogramowanie odpowiedniego zdarzenia, a nie przez ręczne obliczanie czasu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.