2010-07-25 57 views
3

我編寫了一個圖像處理應用程序,其中用Java編寫的GUI部分和數字運算部分用C編寫,並通過JNI調用。繁忙時無法將Java窗口置於前面

我的問題是,它需要20 - 30秒的應用程序來處理圖像,並在此期間應用程序從任務切換器(Alt-Tab thingy)消失,並且不可能移動應用程序的窗口到前面(這是我主要關心的問題)。仍然可以通過任務欄將應用程序置於前面。

一些更多的信息:

  • 應用程序沒有卡住或任何東西,我可以看到它如預期更新進度條。
  • 計算完成後,應用程序將顯示任務切換器,並可以再次成爲頂部窗口。如果我開始新的計算,應用程序將再次從任務切換器中消失。
  • JNI調用是在單獨的線程(來自EDT)上進行的,我已經嘗試了主線程和創建的線程。
  • EDT未被封鎖。我在WindowListener和WindowFocusListener的方法中添加了printf,如果窗口失去焦點,則會調用適當的方法。
  • 在Mac OS X上,應用程序沒有問題。
  • 這是在Windows 2003 Server上的Java 1.6上。
  • 首先,我認爲這是openMP,正在做一些令人討厭的線程,但關閉它並沒有什麼區別。
  • JNI lib是用MinGW 4.5編譯的。

在我看來,Windows期望應用程序應答/發送一些請求,否則將被拋出任務切換器。但是我甚至不知道Windows編程甚至無法在google上找到答案。有人能給我一些指點嗎?

+0

你可以轉移到客戶端 - 服務器模式,在服務器中進行數字運算,更新文件,所以Java應用程序始終可供用戶使用嗎?服務器可以通過套接字連接發送更新,您只需斷開連接即可。 – 2010-07-25 23:56:20

+0

哦,這似乎有點激烈,因爲這是應該工作的這些東西之一。 :-D – Kalle 2010-07-26 12:49:14

回答

1

我不想說這是一個答案,但你確定數字處理正在發生在一個獨立的線程從美國東部時間?因爲嚴重的是,它不應該以這種方式行事。我敢肯定,這其中有一個合乎邏輯的原因,最明顯的是,你在編號緊縮時阻止了美國東部時間。

也許你認爲你正在創建一個新的線程,但你不是?

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

要麼,在數字運算的東西是鎖定了EDT線程需要的資源 - 但我不知道這是什麼可能可能模樣。

+0

我發現錯誤!我通過一年前編寫的回調間接地調用了應用程序的JFrame的setEnabled(false)。那時只需要花費一秒左右的時間來處理,所以我從來沒有注意到這個問題。現在,算法有了很大的改進,但速度更慢......我不知道這是一個良好的夜間睡眠還是您的答案,讓我走在正確的道路上。但從來沒有,我接受你的答案。謝謝! – Kalle 2010-07-26 12:55:20

相關問題