Ожидание завершения потока из сторонней библиотеки (OpenMap / Java)? - PullRequest
0 голосов
/ 20 января 2010

Мое приложение в настоящее время имеет интересную проблему. Эта проблема связана с OpenMap, но, вероятно, может быть применена к любой сторонней библиотеке.

В этом конкретном примере нашему коду необходимо создать наш инструмент OpenMap, загрузить его слои (в фоновом режиме) и сделать снимок экрана с определенной точкой интереса.

Однако проблема в том, что библиотека OpenMap создает свои собственные потоки для загрузки этих слоев, возвращаясь к нашему коду, чтобы сделать снимок экрана немедленно, и в большинстве случаев снимок экрана пуст или неполон.

Псевдокод нашего приложения выглядит следующим образом:

check database for layers
load layers using OpenMap
take screenshot of map at point of interest

Я предположил, что какое-то управление потоками было в порядке, но как это можно сделать, когда библиотека использует свои собственные потоки, к которым у нас нет доступа? Кроме того, OpenMap не имеет возвратов или флагов, указывающих, что этот поток завершен (что я видел).

Есть предложения?

Спасибо

Ответы [ 3 ]

1 голос
/ 21 января 2010

Слои могут быть написаны для OpenMap, чтобы они могли отвечать на проекционные запросы и визуализировать в объект java.awt.Graphics. Расширьте слой OMGraphicHandler, переопределите метод prepare (), чтобы он возвращал OMGraphicList для проекции, установленной на слое. Если вы вызываете Layer.renderDataForProjection (), будет возвращен OMGraphicList, возвращенный в режиме prepare.

com.bbn.openmap.image.ImageServer - хороший объект для управления созданием изображений для ваших слоев.

1 голос
/ 26 октября 2011

У такой же проблемы был сторонний экстрактор jpeg, тянущий изображение до того, как MapBean завершил его создание. Следуя подсказке о вызове позже, добавьте следующий код между моим кодом обработки слоя и моим экспортом в графический код:


//...OpenMap editing code stops here ...

final Runnable doWaitUntilTheMapBeanIsFinishedRendering = new Runnable() {
   public void run()
   {
       System.out.println("Ding, fries are done!");
   } 
};

try
{
    SwingUtilities.invokeAndWait( doWaitUntilTheMapBeanIsFinishedRendering );
}
catch( Exception e )
{
    e.printStackTrace();
}

byte[] image = JPEGImageFormatter.getImageFromMapBean( mapbean );
1 голос
/ 20 января 2010

Я не знаю OpenMap, но обычный способ - зарегистрировать обратный вызов в сторонней библиотеке. В Java это означает реализацию интерфейса и регистрацию в качестве слушателя объекта, для которого вы вызываете метод API. Вы (почти?) Никогда не должны (или не должны) знать что-либо об обработке внутренних потоков библиотеки!

...