3 Stimmen

Java-Fenster kann nicht in den Vordergrund gebracht werden, wenn es besetzt ist

Ich habe eine Bildverarbeitungsanwendung geschrieben, bei der der GUI-Teil in Java geschrieben ist und der Zahlenverarbeitungsteil in C geschrieben ist und über JNI aufgerufen wird.

Mein Problem ist, dass es 20 - 30 Sekunden dauert, bis die Anwendung ein Bild verarbeitet, und während dieser Zeit verschwindet die Anwendung aus dem Task Switcher (das Alt-Tab-Ding) und es ist nicht möglich, das Fenster der Anwendung in den Vordergrund zu verschieben (das ist mein Hauptanliegen). Es ist immer noch möglich, die Anwendung über die Taskleiste in den Vordergrund zu bringen.

Einige weitere Informationen:

  • Die Anwendung hängt nicht fest oder so, ich kann sehen, dass sie wie erwartet einen Fortschrittsbalken aktualisiert.
  • Wenn die Berechnung abgeschlossen ist, wird die Anwendung im Task-Switcher angezeigt und kann wieder das oberste Fenster werden. Wenn ich eine neue Berechnung starte, verschwindet die Anwendung wieder aus dem Task-Switcher.
  • Der JNI-Aufruf erfolgt in einem separaten Thread (vom EDT), ich habe sowohl den Hauptthread als auch einen erstellten Thread ausprobiert.
  • Der EDT ist nicht blockiert. Ich habe printfs in den Methoden von WindowListener und WindowFocusListener hinzugefügt und wenn das Fenster den Fokus verliert, werden die entsprechenden Methoden aufgerufen.
  • Unter Mac OS X funktioniert die Anwendung ohne Probleme.
  • Dies geschieht mit Java 1.6 auf Windows 2003 Server.
  • Zuerst dachte ich, dass es openMP war, das etwas Unangenehmes mit den Threads anstellte, aber das Ausschalten machte keinen Unterschied.
  • Die JNI-Bibliothek wird mit MinGW 4.5 kompiliert.

Ich habe den Eindruck, dass Windows erwartet, dass eine Anwendung einige Anfragen beantwortet/sendet, da sie sonst aus dem Task Switcher geworfen wird. Aber ich weiß nicht einmal genug über Windows-Programmierung, um nach einer Antwort googeln zu können. Kann mir jemand ein paar Tipps geben?

1voto

Erick Robertson Punkte 30890

Ich hasse es, dies als Antwort zu sagen, aber sind Sie sicher, dass die Zahlenberechnung in einem anderen Thread als dem EDT stattfindet? Denn ernsthaft, es sollte sich überhaupt nicht so verhalten. Es gibt einen logischen Grund dafür, ich bin sicher, und die offensichtlichste ist, Sie sind die EDT blockieren, während Sie Zahl crunch.

Vielleicht denken Sie, dass Sie einen neuen Thread erstellen, aber das ist nicht der Fall?

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

Entweder das, oder etwas in der Zahlenverarbeitung sperrt eine Ressource, die der EDT-Thread benötigt - aber ich weiß nicht einmal, wie das aussehen könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X