Многопоточность рисования с использованием BufferedImage - PullRequest
0 голосов
/ 26 января 2020

У меня есть школьное задание, в котором я должен несколько нитей рисовать прямоугольники над изображением. Выполняемые фигуры не могут перекрываться (ie два потока не могут одновременно пытаться рисовать в одной и той же области). Я должен сделать это с помощью get / setRGB, но я пытаюсь обернуть голову, предоставляя такое исключение. Я думаю, что критическим ресурсом будут пиксели в каждой области, так как бы мне, чтобы каждый поток блокировал отдельные пиксели?

1 Ответ

0 голосов
/ 27 января 2020

Вам нужен один SpaceManager, централизованный агент, который будет управлять распределением областей прямоугольника для данного BufferedImage. Для этого потребуется метод allocateRectangle (int sizeX, int sizeY), который найдет неиспользуемое пространство, пометит его как использованный и возвратит DrawingRectangle, и метод freeRectangle (DrawingRectangle dr), который освободит пространство, когда он больше не используется. .

DrawingRectangle - это ваш собственный класс, который имеет ссылку на BufferedImage и знает в нем свое собственное смещение. Он имеет свои собственные методы get / setRGB, которые просто добавляют свои смещения по X и Y и вызывают BufferedImage get / setRGB. Таким образом, клиенты этой системы просто получают DrawingRectangle и получают к нему доступ, как если бы это был его собственный BufferedImage с требуемым размером.

Хитрость в том, что ваши методы allocateRectangle и freeRectangle должны быть синхронизированы, чтобы процесс выделения одного не прерывается другим потоком, который затем пытается выделить свой собственный. Управлять двумерным пространством сложно, если вы пытаетесь оптимизировать упаковку, но я бы не стал беспокоиться, по крайней мере, сначала. Просто подумайте об этом, так как ряды были прямоугольниками, выровненными сверху. Если следующий новый не помещается в существующую строку, создайте новую строку, которая начинается чуть ниже самого высокого прямоугольника самого нижнего ряда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...