【问题标题】:Get notification when external application is fully running - Java在外部应用程序完全运行时获取通知 - Java
【发布时间】:2014-09-08 06:16:45
【问题描述】:

我正在用 java 编写一个程序,它可以启动应用程序,例如 firefox。

编辑:这个程序适用于 linux,特别是 ubuntu。

启动程序很容易:

Runtime.getRuntime().exec("/usr/bin/firefox");

但是,我想在窗口完全打开或运行后从窗口中检索详细信息。

目前我只是在打电话:

Thread.sleep(delay);

确保窗口已准备就绪,但这是一个糟糕的解决方案。不同的窗口需要不同的延迟是个问题。

凌乱。

所以我的问题是,当 Firefox(或任何其他外部应用程序)完全设置时,有什么方法可以通知我?我不认为我可以使用 Process.waitFor() 因为在 firefox 关闭之前进程不会完成。

提前致谢!

更新:Process.waitFor() 不起作用。我已经尝试过了,它只在 Firefox 关闭时返回,而不是在完全设置时返回。只是对于任何自己尝试的人来说,如果另一个 Firefox 窗口已经打开,它将起作用(起初这把我愚弄了)但如果没有现有的窗口,它就不会!

【问题讨论】:

  • 我不知道如何在 linux 上做到这一点,在 windows 上,我们必须检查与该程序关联的窗口是否打开(通过 JNI)。在 linux 中,我只知道正在运行、等待或睡眠、已停止和僵尸的进程状态,然后没有一个拥有你想要的信息。也许你必须像我们在 Windows 上那样使用一些 API。

标签: java linux runtime.exec external-application


【解决方案1】:

您可以使用Process#waitFor 等待命令被执行,然后像这样检查exitValue

Process p = Runtime.getRuntime().exec("/usr/bin/firefox");
p.waitFor();

if(p.exitValue()==0) {

  //success
} else {
  // fail read error stream or out stream for possible causes
}

【讨论】:

  • 这不起作用。就像我在问题中所说的那样,它将等到应用程序关闭然后返回。当应用程序完成设置时,我需要它返回。如果已经打开了 firefox(或任何外部程序)窗口,它将起作用,否则不会。
【解决方案2】:

好的,我一直在考虑更多,我有一个相当令人满意的答案。

与其等到窗口准备就绪,不如使用 xdotool 不断搜索它:

while(line == null){
        writer.write("xdotool search --onlyvisible --name " + name + "\n");
        writer.flush();
        if(reader.ready())
            line = reader.readLine();

        Thread.sleep(1000);
}

xdotool 只会在找到一个名为 name 的窗口时打印一个字符串。

所以如果读者准备好()那么你知道窗口是打开的。

Thread.sleep() 是必要的,因为如果它不存在,xdotool 会吐出一个错误的窗口错误,而读者会读到它。

但是,使用我上面提到的标准延迟似乎几乎更快,但是即使对于需要更长加载时间的窗口,这种解决方案也可以工作,而不是试图猜测延迟。

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2017-09-27
    • 2016-07-11
    • 2012-11-05
    相关资源
    最近更新 更多