Событие Отправка Живопись темы - PullRequest
3 голосов
/ 28 декабря 2011

Просто быстро - я нахожусь в процессе написания эмулятора Sega Master System.До сих пор проект состоял в том, что GUI (подкласс JFrame и т. Д.) Выполняется в потоке диспетчеризации событий через вызов EventQueue.invokeLater (), а все функции эмулятора выполняются в отдельном потоке.Из того, что я понимаю, это должно быть хорошей практикой, так как EDT должен инициализировать и обновлять графический интерфейс, при этом Swing не является поточно-ориентированным.

Это приводит меня к небольшому вопросу - консоль работает вотдельный поток (Z80, VDP и т. д.) и VDP (когда я закончу) обновят BufferedImage.Пока я помечаю этот BufferedImage как «синхронизированный», безопасно ли затем обращаться к нему из EDT (в частности, метод рисования GUI)?Я спрашиваю об этом, так как в противном случае мне придется поместить много логики VDP в сам метод рисования, и я бы предпочел не делать этого, поскольку это замедлит работу графического интерфейса в целом.

Простой вопрос, который я знаю,но я все еще привыкаю к ​​использованию Java2D для обеспечения достойной скорости анимации.Стоит отметить, что сразу после вызова метода repaint () в логическом потоке поток логики будет находиться в спящем режиме до тех пор, пока он не проснется для следующего прохода кадра, поэтому я предполагаю, что от этой конструкции не будет снижения производительности.Я прав?

Большое спасибо, Фил Поттер

ОБНОВЛЕНИЕ Я должен был использовать лучший язык - VDP будет получать доступ к BufferedImage через метод синхронизированного установщика, и EDT будетполучать доступ к нему через синхронизированный метод получения.

1 Ответ

2 голосов
/ 28 декабря 2011

Я не думаю, что вам нужно синхронизировать сеттер и геттер, так как доступ к ним можно получить только из EDT.Итак, давайте сделаем шаг назад.Вы сказали, что доступ к геттеру будет осуществляться из EDT, поэтому мы здесь с защитой потока.Теперь с помощью метода setter будет запускаться на VDP - для обработки этого случая мы хотим вызвать invokeLater (см. Пример).Взгляните здесь для получения дополнительной информации.

Runnable updateAComponent = new Runnable() {

    public void run() { 
//this will run in the EDT
component.doSomething(); 

}

};
//this will run in the VDP
SwingUtilities.invokeLater(updateAComponent);
...