2011-12-27 80 views
3

只是一個快速的一個 - 我在寫一個世嘉主系統仿真器的過程。設計迄今是,GUI(JFrame的子類等)運行在事件指派線程,經由EventQueue.invokeLater()調用,並在單獨的線程中運行所有的仿真器的功能。根據我的理解,這應該是一個好習慣,因爲EDT應該初始化並更新GUI,而Swing不是線程安全的。事件指派線程畫

這使我一個小問題 - 控制檯在單獨的線程(Z80,VDP,等等)和VDP(當我完成了它)將更新一個BufferedImage運行。只要我將這個BufferedImage標記爲'synchronized',是否可以安全地從EDT訪問它(特別是GUI的繪製方法)?我問這個問題,否則我將不得不將很多VDP邏輯放入paint方法本身,我寧願不這樣做,因爲它會降低GUI的整體速度。

簡單的問題,我知道,但我仍然習慣推的Java2D體面速度動畫。值得一提的是,在邏輯線程中調用repaint()方法之後,邏輯線程將一直處於睡眠狀態,直到下一幀通過喚醒爲止,所以我猜測這種設計不會有性能問題 - 上午我對嗎?

非常感謝, 菲爾·波特

UPDATE我應該用更好的語言 - 的VDP將通過同步setter方法來訪問數據的BufferedImage和EDT將通過同步的getter方法來訪問它。

+0

您應該向我們展示一些代碼,顯示您打算做什麼,因爲「將BufferedImage標記爲synchronized」沒有多大意義。方法或代碼塊可以同步,但不是類型。 – 2011-12-27 23:27:53

+0

對不起,我應該用更正確的語言 - 我的意思是,當VDP更新的BufferedImage,它會通過一個同步的「二傳手」的方法做到這一點,而當JFrame的描繪它 - 它會通過一個同步的「吸氣」這樣做方法。由於在EDT中發生繪畫時邏輯線程會睡着,所以EDT不應該等待對象鎖定,因此我認爲這應該起作用。我不確定的原因在於網上有這麼多東西,說GUI不會從另一個線程更新(雖然這是EDT在這種情況下進行繪畫,所以我認爲我沒事)。 – PhilPotter1987 2011-12-27 23:37:44

+1

爲什麼不使用SwingUtilities.invokeLater()將圖像從後臺線程傳遞到EDT? – 2011-12-27 23:42:07

回答

2

我不認爲你需要做的setter和getter同步的,因爲它們只能從美國東部時間進行訪問。所以讓我們退後一步。你說從美國東部時間可以訪問getter,所以我們在這裏是線程安全的。現在使用setter方法將在VDP上運行 - 爲了處理這種情況,我們要調用invokeLater(請參閱示例)。看看here瞭解更多信息。

Runnable updateAComponent = new Runnable() { 

    public void run() { 
//this will run in the EDT 
component.doSomething(); 

} 

}; 
//this will run in the VDP 
SwingUtilities.invokeLater(updateAComponent); 
+0

所以這個解決方案意味着什麼時候邏輯線程來更新BufferedImage,它只是將更新工作交給了EDT?沒有想到這種方式,但是,這是我想的工作。這確實意味着BufferedImage只能從EDT訪問(儘管它是由邏輯線程實例化的)。 – PhilPotter1987 2011-12-28 00:11:39