2011-12-27 42 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