2010-07-25 1 views
3

Java로 작성된 GUI 부분이있는 이미지 처리 응용 프로그램을 작성했으며 번호 계산 부분은 C로 작성되었으며 JNI를 통해 호출됩니다.통화 중일 때 Java 창을 가져올 수 없습니다.

내 문제는 응용 프로그램이 이미지를 처리하는 데 20-30 초가 소요되며이 시간 동안 응용 프로그램은 작업 전환기 (Alt-Tab)에서 사라지고 응용 프로그램의 창을 이동할 수 없다는 것입니다. 앞에 (이것은 내 주요 관심사입니다). 작업 표시 줄을 통해 응용 프로그램을 앞으로 가져올 수도 있습니다.

일부 추가 정보를 원하시면 :

  • 응용 프로그램이 붙어 있지 않거나 아무것도, 나는 예상대로 진행 표시 줄을 업데이트 것을 볼 수 있습니다.
  • 계산이 끝나면 응용 프로그램은 작업 전환기를 표시하고 다시 최상위 창이 될 수 있습니다. 새 계산을 시작하면 응용 프로그램이 작업 전환기에서 다시 사라집니다.
  • JNI 호출은 EDT의 별도 스레드에서 수행되며 주 스레드와 작성된 스레드를 모두 시도했습니다.
  • EDT가 차단되지 않았습니다. WindowListener 및 WindowFocusListener의 메서드에 printfs를 추가했으며 포커스가 손실되면 적절한 메서드가 호출됩니다.
  • Mac OS X에서는 응용 프로그램이 문제없이 작동합니다.
  • 이것은 Windows 2003 Server의 Java 1.6에 있습니다.
  • 처음에는 스레드로 불쾌한 일을하고있는 것은 openMP라고 생각했지만, 사용을 해제해도 아무런 효과가 없었습니다.
  • JNI lib는 MinGW 4.5로 컴파일됩니다.

Windows에서는 응용 프로그램이 응답/일부 요청을 보내거나 그렇지 않으면 작업 전환기에서 벗어날 것으로 예상됩니다. 그러나 나는 심지어 구글을 대답 할 수있을 정도로 윈도우 프로그래밍에 대해 충분히 알지 못한다. 누군가 포인터를 줄 수 있습니까?

+0

클라이언트 - 서버 패러다임으로 이동하여 파일을 업데이트하면서 서버에서 번호 계산을 수행 할 수 있으므로 Java 응용 프로그램을 항상 사용자가 사용할 수 있습니까? 서버는 소켓 연결을 통해 업데이트를 보낼 수 있습니다. –

+0

아, 일하기로되어있는 것들 중 하나이기 때문에 좀 과격한 것 같습니다. :-D – Kalle

답변

1

답변으로 말씀하시는 것이 싫지만 EDT와는 별도의 스레드에서 번호 계산이 이루어지고 있는지 확인 하시겠습니까? 진지하게 말하면, 이런 식으로 행동해서는 안됩니다. 논리적 인 이유가 있습니다. 확실합니다. 가장 명백한 것은, 당신이 위기에 처한 동안 EDT를 막고 있다는 것입니다.

아마도 새 스레드를 만드는 것 같지만 그렇지 않습니까? 숫자 사각 사각에 그, 또는 뭔가 하나

 
Runnable r = new Runnable() { 
    public void run() { 
    ClassName.this.executeJNI(); 
    } 
}; 
new Thread(r).start(); 

은 EDT 스레드가 필요로하는 자원을 잠금 -하지만 난이 가능처럼 볼 수 있었다 모르겠어요.

+0

오류를 발견했습니다! 1 년 전에 작성한 콜백을 통해 간접적으로 응용 프로그램의 JFrame에서 setEnabled (false)를 호출했습니다. 그때 나는이 문제를 결코 알지 못하기 때문에 처리를하는 데 1 초 정도 밖에 걸리지 않았습니다. 이제 알고리즘은 많이 개선되었지만 느린 것입니다 ... 좋은 밤 수면인지 아니면 올바른 경로에 놓은 답인지 모르겠습니다. 그러나 결코 적게, 나는 당신의 대답을 받아들입니다. 감사! – Kalle