桌面应用程序-Windows:用信号通知Java进程显示其窗口



我有一个在后台运行的Java进程。如何快速向进程发出信号以显示其窗口?我想要一个非常轻量级的脚本,可以做到这一点,并且可以从"开始"菜单启动。

我认为可能是一个BAT文件,它检查锁定文件是否在最后几秒钟内被触摸,向进程发出信号,否则,创建一个新的。该信号可以通过创建进程将要侦听的另一个文件来实现。

这是有效的,但似乎效率低下。犹豫听起来是不可避免的。

我可以使用Java而不是BAT文件,但这仍然留下了如何向后台进程发出信号的问题。这只需要在Windows中工作,但我擅长Java,所以这就是我正在使用的。

有什么想法吗?

一种选择是让该进程在端口上有一个侦听器(例如8888),然后可以向该端口发送消息(或执行类似telnet localhost 8888的操作)。正在运行的进程可以有一个单独的线程在该端口上侦听

另一种选择是使用与JVM的JMX通信—请参阅http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html

是否有任何东西阻止您从Java进程中检查锁定文件?您可以使用Observer模式来提醒主线程(或哪个线程)注意文件中的更改。

例如:


public class FileWatcher implements Observable {
  private long lastModified;
  private final File file;
  public FileWatcher(File f) {
     this.file = f;
     this.lastModified = file.lastModified();
     Thread t = new Thread() {
        public void run() {
           while(!stopThread) {
           if(lastModified < file.lastModified()) {
              lastModified = file.lastModified();
              setChanged();
              notifyObservers();
           }    
           Thread.currentThread().sleep(5);      
           }
        }
     };
     t.start();
  }
}

免责声明:根本没有经过测试或验证,但我相信你已经明白了。

编辑:哎呀,忘了循环了。

编辑:新想法。

我有另一个想法。(我知道你已经接受了一个答案,但我想把它扔出去。)可以使用select函数吗?在我对MSDN文档的有限浏览中,这只是在套接字的上下文中提到的。我知道Linux等价物适用于任何文件描述符。

与其简单地在我上面提到的线程中轮询文件,不如让操作系统来做!将文件传递到设置为selectwritefds中,然后在修改文件时返回。这意味着您的进程不会花费宝贵的CPU时间等待对文件的更改。

我还没有验证Java是否在JDK中公开了这个调用,所以可能需要编写一个JNI接口才能使其工作。对不起,我在这方面的知识有点模糊。

再次编辑:

找到了!Java的Selector类看起来像是实现了select。不幸的是,FileChannel是不可选择的,这在这种情况下可能是必需的。:(

最新更新