当Java窗口忙碌时无法将其置于前台

3
我编写了一个图像处理应用程序,其中GUI部分使用Java编写,数字计算部分使用C编写,并通过JNI调用。我的问题是,该应用程序需要20-30秒才能处理一张图像,在此期间应用程序会从任务切换器(Alt-Tab)中消失,并且无法将应用程序的窗口移到前面(这是我最关心的问题)。但是仍然可以通过任务栏将应用程序移到前面。以下是更多信息:
- 应用程序没有卡住或其他问题,我可以看到它按预期更新进度条。 - 计算完成后,应用程序将显示在任务切换器中,并且可以再次成为顶层窗口。如果我开始新的计算,则应用程序将再次从任务切换器中消失。 - JNI调用在单独的线程上进行(不是EDT),我尝试过主线程和创建的线程。 - EDT未被阻塞。我已经在WindowListener和WindowFocusListener方法中添加了printfs,如果窗口失去焦点,则会调用相应的方法。 - 在Mac OS X上,应用程序可以正常工作。 - 这是在Windows 2003 Server上的Java 1.6上运行的。 - 起初,我认为可能是openMP在处理线程时出现了问题,但关闭它并没有任何区别。 - JNI库使用MinGW 4.5编译。
对我来说,Windows似乎希望应用程序回答/发送一些请求,否则它将被从任务切换器中删除。但我甚至不知道足够的Windows编程知识来搜索答案。有人能给我一些指导吗?

你能否将应用程序转移到客户端-服务器范式,让数字计算在服务器上进行,并更新文件,以便Java应用程序始终对用户可用?服务器可以通过套接字连接发送更新,只需断开两者的连接即可。 - James Black
哦,这似乎有点过激,因为这是应该能够正常工作的事情。:-D - Kalle
1个回答

1

我很不想这样回答,但你确定数字计算是在与EDT分离的线程上进行吗?因为严格来说,它根本不应该以这种方式运行。我相信有一个逻辑原因,最明显的原因是,你正在阻塞EDT而进行数字计算。

也许你认为你正在创建一个新线程,但实际上并没有?

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

要么如此,要么数字计算中的某些内容正在锁定EDT线程需要的资源 - 但我甚至不知道这可能看起来像什么。


我找到错误了!一年多以前写的某些回调函数间接地调用了应用程序的JFrame上的setEnabled(false)。当时处理只需要一两秒钟,所以我从未注意到这个问题。现在算法得到了很大改善,但速度变慢了...我不知道是良好的睡眠还是您的答案让我走上了正确的道路。不管怎样,我接受了您的答案。谢谢! - Kalle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接