powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / swing и потоки
15 сообщений из 15, страница 1 из 1
swing и потоки
    #38384750
pporubov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! подскажите что я делаю не так. Суть кода в том, чтобы нарисовать ноту на нотном стане и одновременно ее проиграть. Думал, что будет работать, но все равно проигрывается с опозданием. Проигрывается все простой 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
swing и потоки
    #38384810
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pporubov,

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

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

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

авторНо создавать-то его надо заранее, а лучше вообще из пула брать.
для меня это просто новое. что значит брать из пула?[/quot]
http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html
Это значит взять какой-то существующий спящий Thread и запустить в нём свою задачу, вместо того чтобы каждый раз создавать новый Thread.
...
Рейтинг: 0 / 0
swing и потоки
    #38385370
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pporubovтормозит не сильно, порятка 0,3 сек.
тогда в чём проблема?
Для меня 0,3 и потом звук файл не критично.
А вообще 0,3 - много для отрисовки. Можно покопать почему.
...
Рейтинг: 0 / 0
swing и потоки
    #38385373
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
swing и потоки
    #38385452
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczSwing и Java2D вообще не очень-то предназначены для анимации. Нормального API для этого нет.
JavaFX?
...
Рейтинг: 0 / 0
swing и потоки
    #38385473
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkJavaFX?
Да. Там уже API для анимации имеется в наличии.
...
Рейтинг: 0 / 0
swing и потоки
    #38385763
pporubov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНе знаю, что там внутри 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
swing и потоки
    #38385768
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pporubov,

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


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