2014-07-17 5 views
1

저는 파이어 폭스와 같은 응용 프로그램을 시작할 수있는 java로 프로그램을 작성하고 있습니다.외부 응용 프로그램이 완전히 실행 중일 때 알림 받기 - Java

편집 :이 프로그램은 리눅스, 특히 우분투 용입니다.

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

는 그러나, 나는 완전히 열거 나 실행되면 창에서 세부 정보를 검색 할 :

이 프로그램을 시작하기 쉽습니다.

Thread.sleep(delay); 

윈도우가 준비되어 있는지 확인하려면하지만이 가난한 솔루션입니다 : 순간

난 그냥 전화 했어. 다른 지연이 필요한 다른 창은 문제입니다.

지저분한.

내 질문에, 거기에 어떤 방식으로 파이어 폭스 (또는 그 문제에 대한 다른 외부 응용 프로그램) 완전히 설치할 때 알림을받을 수 있습니까? firefox가 닫힐 때까지 프로세스가 완료되지 않기 때문에 Process.waitFor()를 사용할 수 없다고 생각합니다.

미리 감사드립니다.

업데이트 : Process.waitFor()가 작동하지 않습니다. 나는 그것을 시도하고 파이어 폭스가 닫혀있을 때만 반환되며, 완전히 설정되지 않은 경우에는 반환되지 않습니다. 처음에는 다른 파이어 폭스 창을 열어 놓은 채로 작동 시키면 (처음에는 나를 바보로 만들었지 만) 기존 창이 없다면 그렇지 않을 것입니다!

+1

나는 리눅스에서 어떻게 할 수 있는지 모르겠다. 윈도우에서 우리는 그 프로그램과 관련된 창이 열려 있는지 (JNI를 통해) 확인해야 할 것이다. 리눅스에서는 Running, Waiting 또는 Sleeping, Stopped and Zombie 등의 프로세스 상태에 대해서만 알고 있으며 원하는 정보를 보유하고있는 사람은 아무도 없습니다. 아마도 우리는 몇 가지 API를 사용하여 Windows에서하는 것처럼해야 할 것입니다. –

답변

0

좋아, 내가 좀 더 생각을하고있다 나는 상당히 만족스러운 답변이 있습니다. 대신 윈도우 때까지 기다리는

준비가 지속적으로 xdotool로 검색 : 그것은 이름이라는 창을 찾으면

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

     Thread.sleep(1000); 
} 

xdotool는 문자열을 인쇄합니다.

그래서 리더가 준비되면() 그러면 창이 열려 있다는 것을 알 수 있습니다.

Thread.sleep()이 없으면 xdotool이 잘못된 창 오류를 일으키고 판독기에서 읽을 수 있기 때문에 Thread.sleep()이 필요합니다.

그러나 위에서 설명한 것처럼 표준 지연을 사용하는 것이 더 빠를 것 같지만이 솔루션은 지연을 예상하는 것보다는로드하는 데 시간이 오래 걸리는 Windows에서도 작동합니다.

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 
} 
+0

이것은 작동하지 않습니다. 질문에서 말했듯이, 응용 프로그램이 닫히고 다시 돌아올 때까지 기다릴 것입니다. 신청서 작성이 끝나면 다시 제출해야합니다.이미 열려있는 파이어 폭스 (또는 어떤 외부 프로그램이든)가있는 경우에는 작동하지만 그렇지 않은 경우에는 작동합니다. –