2014-01-08 37 views
1

我們正在構建/維護一個複雜的運動控制平臺控制應用程序,其中包含14個子系統,每個子系統都有自己的線程,包括多個動態2D或3D窗口。舊版要求要求在Windows(XP或7)之上,運行在具有Java3D 1.5.2的Java jre6 jdk1.6.0_21之上的JRuby 1.5.2。JRuby/Java Swing Tooltip重疊窗口框架將顯示速度降至4 Hz

當2D控制面板窗口,空佈局的一個一個的Java Swing工具提示彈出,重疊&底部邊緣或有時在窗口的右側邊緣,整體的Windows的Java畫面更新率外時(所有窗口)從16赫茲降低到4赫茲。通常這種效果會一直持續,直到其中一個窗口被調整大小。有時這種效果在工具提示消失時消失。偶爾,效果不會發生。

這在32位Windows XP和64位Windows 7上都會出現,指向更多的Java。還有其他一些有趣的錯誤,其中Windows休眠時鐘實際上在隨機無關的第三方通信應用程序正在運行時加速,但我認爲這是一個紅鯡魚 - 這絕對是Java + Windows窗口布局錯誤。最好的猜測是Windows無法處理Java快速調整有效窗口區域的大小?但是,爲什麼即使在工具提示彈出消失之後效果仍會繼續?

一個來源報告改進,確保所有工具提示「寬於150像素」。這是一種解決方法,雖然:由於該錯誤的機制尚不清楚,並且該錯誤是隨機的,所以這種有用的巫術似乎不能保證解決方案;它也排除了簡短的工具提示。

有誰知道爲什麼JRuby/Java/Swing/Windows的這種組合存在工具提示問題,以及對此可以做些什麼呢?

+0

請什麼理由在本地操作系統下使用頻率的延遲,我覺得> = 25-33 – mKorbel

+0

這些都是實際來自Java真正在做什麼的測量,而不是我們設定的。然而,在一個具有簡單的基本70年代2D按鈕控制面板的實時控制系統中,沒有理由刷新過去的16Hz,這肯定會爲系統負載增加安全餘量。滾動示波器在16Hz仍然正常。但是,當Java給我們4Hz時,示波器是相當不可接受的。 – DragonLord

+0

同意,在Win8沒有問題,但大多數用戶(如你所說的Win7/32)運行在Win7(企業平臺)/ XP – mKorbel

回答

2

附加一個profiler到正在運行的應用程序可能會提供一些見解,但隨機失敗往往意味着不正確的同步。 全部 Swing GUI對象必須被構建和操縱只有event dispatch thread上。要查找違規行爲,請使用引用here的方法之一。 ToolTipManager嘗試使用輕量級組件來顯示工具提示。如果應用程序混合使用輕型和重型重量組件,可以嘗試禁用該功能:

ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); 
+1

非常感謝這個優秀的答案。我們嘗試了ToolTipManager黑客,它不適合我們。在事件派發線程中運行Swing是正確的答案。但是,出於實際的原因,我們不可能將三個傳統圖形控制管理器重寫到主調度線程中。我們結束了150像素的限制,在正常分辨率下大約2「+或大約6+個單詞。到目前爲止,這是行得通的,再次感謝您。 – DragonLord