Windows: сигнализирует процессу Java, чтобы показать его окно - PullRequest
0 голосов
/ 08 июня 2011

У меня есть процесс Java, который работает в фоновом режиме. Как я могу быстро подать сигнал процессу, чтобы показать его окно? Мне нужен действительно легкий скрипт, который может это сделать и может быть запущен из меню «Пуск».

Я думаю, что, может быть, BAT-файл, который проверяет, был ли файл блокировки затронут в последние несколько секунд, сигнализирует о процессе, в противном случае создайте новый. Сигнал может быть вызван созданием другого файла, который процесс будет прослушивать.

Это работает, но кажется неэффективным. Колебание звучит неизбежно.

Я мог бы использовать Java вместо BAT-файла, но это оставляет вопрос о том, как сигнализировать о фоновом процессе. Это должно работать только в Windows, но я хорошо разбираюсь в Java, поэтому я использую это.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Одним из вариантов будет иметь этот процесс, имеющий прослушиватель на порту (как пример 8888), тогда вы можете отправить сообщение на этот порт (или сделать что-то вроде telnet localhost 8888).У запущенных процессов может быть отдельный поток, прослушивающий этот порт.

Другой вариант - использовать соединение JMX с JVM - см. http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html

1 голос
/ 08 июня 2011

Что-нибудь мешает вам проверить файл блокировки в вашем 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 применим к любому дескриптору файла.

Вместо того, чтобы просто опрашивать файл в потоке, который я упомянул выше, позвольте ОС сделать это!Передайте файл в writefds, установленный на select, и он вернется, когда файл будет изменен.Это означает, что ваш процесс не тратит драгоценное время процессора на ожидание изменений в файле.

Я не проверял, выставляет ли Java этот вызов в JDK, поэтому может потребоваться написание интерфейса JNI, чтобы получитьэто на работу.Мои знания в этой области немного размыты, извините.

Снова отредактируйте:

Нашли!Класс Selector в Java выглядит так, как будто он реализует select.К сожалению, FileChannel не может быть выбран, что, вероятно, требуется в этом случае.(

...