Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / swing и потоки / 15 сообщений из 15, страница 1 из 1
02.09.2013, 22:24:51
    #38384750
pporubov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
Здравствуйте! подскажите что я делаю не так. Суть кода в том, чтобы нарисовать ноту на нотном стане и одновременно ее проиграть. Думал, что будет работать, но все равно проигрывается с опозданием. Проигрывается все простой midi, тормозить не должно из-за этого.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
String note = gn.getGeneratedNote();
final int key = gn.getGeneratedKey();
                
ap.setMeasureArguments(note, 0, false); // класс extends JPanel
ap.repaint(); // нарисовать ноту
                
Thread t = new Thread(new Runnable() {
       public void run() {
        new PlayNote().play(key, instr); // проиграть ноту
    }
});
t.start();
...


Пробовал использовать Timer, но все равно не получается.
...
Рейтинг: 0 / 0
03.09.2013, 00:43:15
    #38384810
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
pporubov,

я бы создал два потока. один для проигрывания, второй для рисования. оба запускаются из одного места. причем прорисовку ноты привязал бы к длительности звука.
...
Рейтинг: 0 / 0
03.09.2013, 09:10:03
    #38384920
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
kadetpporubov, я бы создал два потока. один для проигрывания, второй для рисования. оба запускаются из одного места. причем прорисовку ноты привязал бы к длительности звука.
"Для рисования" поток уже есть. EDT называется.. А вот для проигрывания по идее нужен отдельный. Но создавать-то его надо заранее, а лучше вообще из пула брать. Ну и кидать ему уже готовые объекты тоже - проигрыватель, поток (в смысле Stream) с музыкой. И вот тогда - если по нажатию кнопочки, допустим, отправлять событие в EDT для показа ноты, и сказать музыкальному потоку играть, всё должно быть как надо.
...
Рейтинг: 0 / 0
03.09.2013, 10:55:02
    #38385085
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
pporubov,
- если что-то тормозит, то нужно говорить цифрами на сколько
- отрисовка занимает 0,0001 сек. Зачем здесь потоки?
...
Рейтинг: 0 / 0
03.09.2013, 13:15:35
    #38385332
pporubov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
авторpporubov,
- если что-то тормозит, то нужно говорить цифрами на сколько
- отрисовка занимает 0,0001 сек. Зачем здесь потоки?
тормозит не сильно, порятка 0,3 сек.
авторНо создавать-то его надо заранее, а лучше вообще из пула брать.
для меня это просто новое. что значит брать из пула?
...
Рейтинг: 0 / 0
03.09.2013, 13:28:25
    #38385355
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
pporubov, если утрировано, то это набор заранее созданных и пока "спящих" потоков.. Использование пула потоков позволяет избежать накладных расходов на их пересоздание, уничтожение в JVM.

Кстати, в Swing есть же SwingWorker . Как же я про него забыл! Вот что значит давно со Swing-ом дел не иметь..
...
Рейтинг: 0 / 0
03.09.2013, 13:30:53
    #38385362
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
mesierКстати, в Swing есть же SwingWorker . Как же я про него забыл! Вот что значит давно со Swing-ом дел не иметь..
Здесь он, вроде, не особо нужен, так как его основная цель синхронизировать результаты параллельной обработки с EDT.
...
Рейтинг: 0 / 0
03.09.2013, 13:33:17
    #38385367
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
pporubovтормозит не сильно, порятка 0,3 сек.

new Thread().start() это довольно ресурсоёмкая операция.
Не знаю, что там внутри new PlayNote(), но не исключено, что там тоже создаётся какой-нибудь прогрыватель и читает файл с диска.

авторНо создавать-то его надо заранее, а лучше вообще из пула брать.
для меня это просто новое. что значит брать из пула?[/quot]
http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html
Это значит взять какой-то существующий спящий Thread и запустить в нём свою задачу, вместо того чтобы каждый раз создавать новый Thread.
...
Рейтинг: 0 / 0
03.09.2013, 13:34:53
    #38385370
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
pporubovтормозит не сильно, порятка 0,3 сек.
тогда в чём проблема?
Для меня 0,3 и потом звук файл не критично.
А вообще 0,3 - много для отрисовки. Можно покопать почему.
...
Рейтинг: 0 / 0
03.09.2013, 13:37:12
    #38385373
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
pporubov
Код: java
1.
ap.repaint(); // нарисовать ноту


repaint() ничего не рисует. Он лишь отдаёт команду отрисовать текущее состояние заново. Это может произойти не сразу.
Swing и Java2D вообще не очень-то предназначены для анимации. Нормального API для этого нет. Стоит найти внятых примеров.

pporubov
Код: java
1.
2.
3.
4.
5.
6.
Thread t = new Thread(new Runnable() {
       public void run() {
        new PlayNote().play(key, instr); // проиграть ноту
    }
});
t.start();



Многие из этих действий нет смысла выполнять каждый раз. Можно оптимизировать создание потока и плеера. Создав их единожды, использовать для проигрывания.
Скачайте "killer game programming in java" там есть примеры про работу со звуком.
...
Рейтинг: 0 / 0
03.09.2013, 14:18:46
    #38385452
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
BlazkowiczSwing и Java2D вообще не очень-то предназначены для анимации. Нормального API для этого нет.
JavaFX?
...
Рейтинг: 0 / 0
03.09.2013, 14:29:42
    #38385473
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
avp.mkJavaFX?
Да. Там уже API для анимации имеется в наличии.
...
Рейтинг: 0 / 0
03.09.2013, 17:27:10
    #38385763
pporubov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
авторНе знаю, что там внутри new PlayNote(), но не исключено, что там тоже создаётся какой-нибудь прогрыватель и читает файл с диска.
Там все очень просто.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
import javax.sound.midi.*;

public class PlayNote {

	void play(int note, int instrument) {
		
		try {
			Sequencer sequencer = MidiSystem.getSequencer();
			sequencer.open();
			
			Sequence seq = new Sequence(Sequence.PPQ, 5);
			Track track = seq.createTrack();
			
			ShortMessage msg1 = new ShortMessage();
			msg1.setMessage(ShortMessage.PROGRAM_CHANGE, 0, instrument, 0);
			MidiEvent me1 = new MidiEvent(msg1, 1);
			track.add(me1);
			
			ShortMessage msg2 = new ShortMessage();
			msg2.setMessage(ShortMessage.NOTE_ON, note, 100);
			MidiEvent me2 = new MidiEvent(msg2, 1);
			track.add(me2);
			
			ShortMessage msg3 = new ShortMessage();
			msg3.setMessage(ShortMessage.NOTE_OFF, note, 100);
			MidiEvent me3 = new MidiEvent(msg3, 16);
			track.add(me3);
			
			sequencer.setSequence(seq);
			sequencer.start();
			Thread.sleep(2000);
			sequencer.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}



авторrepaint() ничего не рисует. Он лишь отдаёт команду отрисовать текущее состояние заново. Это может произойти не сразу. Swing и Java2D вообще не очень-то предназначены для анимации. Нормального API для этого нет. Стоит найти внятых примеров.

я же устанавливаю новые значения переменных используемых для отрисовки в ap.setMeasureArguments(note, 0, false); а потом делаю repaint(); да и со скоростью отрисовки проблем нет, проблема со скоростью проигрывания.
...
Рейтинг: 0 / 0
03.09.2013, 17:29:57
    #38385768
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
pporubov,

Почему Sequence и Sequencer надо пересоздавать каждый раз, вместо того чтобы создать один раз и потом проигрывать на нём?
...
Рейтинг: 0 / 0
03.09.2013, 17:33:19
    #38385775
pporubov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
swing и потоки
спасибо за замечание. давно писал этот класс, когда еще мало в java понимал.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / swing и потоки / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]