Не могу вывести окно Java на передний план, когда занят - PullRequest
3 голосов
/ 26 июля 2010

Я написал приложение для обработки изображений с частью GUI, написанной на Java, а часть обработки чисел написана на C и вызывается через JNI.

Моя проблема в том, что приложению требуется 20 - 30 секунд для обработки изображения, и в течение этого времени приложение исчезает из переключателя задач (Alt-Tab), и невозможно переместить окно приложения фронт (это моя главная забота). По-прежнему возможно вывести приложение на передний план с помощью панели задач.

Дополнительная информация:

  • Приложение не зависло или что-то еще, я вижу, что оно обновляет индикатор выполнения, как и ожидалось.
  • Когда вычисления будут выполнены, приложение отобразит переключатель задач и снова может стать верхним окном. Если я начну новый расчет, приложение снова исчезнет из переключателя задач.
  • Вызов JNI выполняется в отдельном потоке (из EDT), я пробовал как основной поток, так и созданный поток.
  • EDT не заблокирован. Я добавил printfs в методы WindowListener и WindowFocusListener, и если окно теряет фокус, вызываются соответствующие методы.
  • В Mac OS X приложение работает без проблем.
  • Это на Java 1.6 на Windows 2003 Server.
  • Сначала я подумал, что это openMP, что делает что-то неприятное с потоками, но отключение не имело никакого значения.
  • Библиотека JNI скомпилирована с MinGW 4.5.

Мне кажется, что Windows ожидает, что приложение ответит / отправит некоторые запросы, иначе оно будет выброшено из переключателя задач. Но я даже не знаю достаточно о программировании Windows, чтобы даже найти ответ в Google. Кто-нибудь может дать мне несколько советов?

1 Ответ

1 голос
/ 26 июля 2010

Мне неприятно говорить это как ответ, но вы уверены, что сокращение числа происходит в отдельном потоке от EDT?Потому что серьезно, это не должно вести себя так.Я уверен, что для этого есть логическая причина, и наиболее очевидным является то, что вы блокируете EDT во время обработки номера.

Возможно, вы думаете, что создаете новую тему, ноне так?

Runnable r = new Runnable() {
  public void run() {
     ClassName.this.executeJNI();
  }
};
new Thread(r).start();

Либо это, либо что-то в обработке чисел блокирует ресурс, который нужен потоку EDT - но я даже не знаю, как это могло бы выглядеть.

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