Windows: подача сигнала процессу Java показать свое окно

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

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

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

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

Есть идеи?


person 700 Software    schedule 08.06.2011    source источник


Ответы (2)


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

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

person BZ.    schedule 08.06.2011
comment
Если бы не было столько требований, я бы использовал JMX. Это кажется немного сложным. Я буду использовать метод слушателя. Не использую порт 8888, потому что хочу предотвратить конфликты. Вероятно, что-то случайное. Мой принятый метод здесь: stackoverflow.com/questions/6345153/ - person 700 Software; 18.06.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 нельзя выбрать, что, вероятно, необходимо в данном случае. :(

person Tom    schedule 08.06.2011
comment
Я хочу избежать периодического нажатия на файл. Это была идея, которую я уже упоминал. Сигналом может быть создание другого файла, который процесс будет прослушивать. Это работает, но кажется неэффективным. Колебание кажется неизбежным.. В приведенном выше примере вы проверяете файл 200 раз в секунду. Похоже, это замедлит работу ПК, хотя и устранит колебания :) - person 700 Software; 18.06.2011
comment
Это хороший момент, но что запускает сигнал? Например, если вы ждете, пока кто-то изменит файл (и просто опрашиваете с помощью скрипта), разве у вас нет той же проблемы? - person Tom; 18.06.2011
comment
Кроме того, у меня была еще одна дикая идея - посмотрите 2-й EDIT, если вам интересно. :) - person Tom; 18.06.2011
comment
Я не уверен, что вы спрашиваете в своем первом комментарии. Я пытался избежать идеи, о которой я уже упоминал. Элемент, который запускает сигнал, — это ярлык на рабочем столе, который запускает команду (коснитесь файла или, в моем принятом решении, отправьте пакет UDP). Пользователь щелкает ярлык, и это выводит мое приложение на передний план. В любом случае спасибо за новую идею... - person 700 Software; 18.06.2011
comment
О, я вижу. Извините - я неправильно понял. - person Tom; 18.06.2011