开发者

Can't bring Java window to front when busy

开发者 https://www.devze.com 2023-01-08 15:00 出处:网络
I have written an image processing application with the GUI part written in Java and the number crunching part is written in C and is called via JNI.

I have written an image processing application with the GUI part written in Java and the number crunching part is written in C and is called via JNI.

My problem is that it takes 20 - 30 seconds for the application to process an image, and during this time the application disappears from the Task Switcher (the Alt-Tab thingy) and it is not possible to move the application's window to the front (th开发者_StackOverflow中文版is is my main concern). It is still possible to bring the application to front via the task bar.

Some more info:

  • The application isn't stuck or anything, I can see that it updates a progress bar as expected.
  • When the calculation is done, the application will show up the Task Switcher and can become the top window again. If I start a new calculation the application will disappear from the Task Switcher again.
  • The JNI call is made on a separate thread (from EDT), I have tried both the main thread and a created thread.
  • The EDT is not blocked. I have added printfs in WindowListener's and WindowFocusListener's methods and if the window lose focus the appropriate methods are called.
  • On Mac OS X the application works without problem.
  • This is on Java 1.6 on Windows 2003 Server.
  • First I thought that it was openMP that was doing something nasty with the threads, but turning it off didn't make any difference.
  • The JNI lib is compiled with MinGW 4.5.

It seems to me that Windows expects that an application answer/send some requests or else it will be thrown out of the Task Switcher. But I don't even know enough about Windows programming to even be able to google for an answer. Can someone give me some pointers?


I hate to say this as an answer, but are you sure that the number crunching is happening on a separate thread from the EDT? Because seriously, it shouldn't be behaving this way at all. There's a logical reason for it, I'm sure, and the most obvious is, you're blocking the EDT while you number crunch.

Maybe you think you're creating a new thread, but you're not?

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

Either that, or something in the number crunching is locking a resource that the EDT thread needs - but I don't even know what this could possibly look like.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号