【问题标题】:Can't bring Java window to front when busy忙时无法将 Java 窗口置于最前面
【发布时间】:2011-03-20 20:53:45
【问题描述】:

我编写了一个图像处理应用程序,其中 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 应用程序?服务器可以通过套接字连接发送更新,您只需断开两者。
  • 哦,这似乎有点激烈,因为这是应该起作用的其中之一。 :-D

标签: java windows java-native-interface openmp


【解决方案1】:

我不想这样回答,但您确定数字运算发生在与 EDT 不同的线程上吗?因为说真的,它根本不应该这样表现。我敢肯定,这有一个合乎逻辑的原因,最明显的是,你在数字紧缩时阻塞了 EDT。

也许你认为你正在创建一个新线程,但你不是?

可运行 r = new Runnable() { 公共无效运行(){ 类名.this.executeJNI(); } }; 新线程(r).start();

要么是这样,要么是数字运算中的某些东西正在锁定 EDT 线程需要的资源 - 但我什至不知道这可能是什么样子。

【讨论】:

  • 我发现了错误!我通过一年多前写的一些回调间接调用了应用程序的 JFrame 上的 setEnabled(false)。那时处理只需要一秒钟左右,所以我从来没有注意到这个问题。现在算法得到了很大改进,但速度较慢......我不知道这是一个良好的夜间睡眠还是你的回答让我走上了正确的道路。但无论如何,我接受你的回答。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多