Выполнение логики в отдельном потоке все еще блокирует пользовательский интерфейс - Java - PullRequest
1 голос
/ 17 апреля 2011

Я разработал простое приложение MIDI, которое позволяет мне воспроизводить ноты MIDI, чтобы пользователь мог взаимодействовать с пользовательским интерфейсом во время воспроизведения звуков MIDI, и я поместил необходимую логику в анонимный подкласс, например:

public static void Play() 
{
        new Thread(new Runnable() 
        {
            public void run() 
            {
                if (!_sequencer.isRunning()) 
                {
                    try 
                    {
                        _sequencer.setSequence(_sequence);
                        _sequencer.start();
                    } 
                    catch (Exception e) 
                    {
                        Logger.Add(e.getMessage());
                    }
                }
            }
        }).start();
    }

Хотя музыка начинает играть, пользовательский интерфейс по-прежнему не реагирует, например, когда я нажимаю на ComboBox, у меня что-то похожее работает в C #.

Есть ли какое-то предостережение для потока в Java, которое объясняет поведение, которое я вижу?

(Java API, который я использую, если это поможет - javax.sound.midi )

Спасибо за ваше время.

Edit:

Нажмите еще раз на пользовательский интерфейс и заметите что-то интересное; кажется, что все работает нормально, за исключением двух ComboBox в верхнем левом углу, я пытался удалить их и заменить их, но без разницы. При щелчке блоки изменяются на синий (как обычно), но под ним не отображается раскрывающееся окно, и цвет не возвращается к значению по умолчанию, если фокус находится на другом компоненте пользовательского интерфейса. Может быть, это ошибка, представленная NetBeans?

Пример: * ** 1022 тысячу двадцать одна * enter image description here

Редактировать 2:

Что ж, после долгих проб и ошибок я наконец нашел причину проблемы, многопоточность отлично работает. Проблема заключалась в том, что NetBeans каким-то образом перенастроил мои компоненты пользовательского интерфейса, в результате чего окно заполнило весь экран, изменение размера вручную, а тестирование ComboBox показало, что они действительно работают нормально.

Спасибо всем за отзывы!

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Что делает поле со списком при нажатии?Взаимодействует ли он с _sequencer?Кроме того, был ли ваш секвенсор создан в потоке пользовательского интерфейса?Я подозреваю, что хотя вы вызываете метод start в отдельном потоке, секвенсор по-прежнему работает в контексте, в котором он был создан (т. Е. Поток пользовательского интерфейса).

Попробуйте создать секвенсор в воспроизводящем потоке (т.е.НЕ поток пользовательского интерфейса) и посмотрите, освобождает ли это ваш пользовательский интерфейс.

0 голосов
/ 17 апреля 2011

Что ж, после долгих проб и ошибок я наконец нашел причину проблемы, многопоточность отлично работает. Проблема заключалась в том, что NetBeans каким-то образом перенастроил мои компоненты пользовательского интерфейса, что заставляет Window заполнять экран, изменение размера вручную и тестирование ComboBox показало, что они на самом деле работают нормально.

...