gpt4 book ai didi

multithreading - 事件调度线程绘画

转载 作者:行者123 更新时间:2023-12-04 06:53:36 25 4
gpt4 key购买 nike

只是一个快速的 - 我正在编写一个 Sega Master System 模拟器。到目前为止的设计是 GUI(JFrame 子类等)通过 EventQueue.invokeLater() 调用在事件调度线程中运行,并且所有仿真器函数在单独的线程中运行。据我所知,这应该是一个很好的做法,因为 EDT 应该初始化和更新 GUI,而 Swing 不是线程安全的。

这引出了一个小问题 - 控制台在单独的线程(Z80、VDP 等)中运行,VDP(当我完成它时)将更新 BufferedImage。只要我将这个 BufferedImage 标记为“同步”,那么从 EDT(特别是 GUI 的绘制方法)访问它是否安全?我问这个,否则我将不得不将大量 VDP 逻辑放入 paint 方法本身,我宁愿不这样做,因为它会降低整体 GUI 的速度。

我知道这是一个简单的问题,但我仍然习惯于插入 Java2D 实现速度不错的动画。值得一提的是,在逻辑线程中调用 repaint() 方法后,逻辑线程将休眠直到为下一帧传递唤醒,所以我猜这种设计不会对性能造成影响 - 我对吗?

非常感谢,菲尔·波特

更新我应该使用更好的语言 - VDP 将通过同步 setter 方法访问 BufferedImage,而 EDT 将通过同步 getter 方法访问它。

最佳答案

我认为您不需要使 setter 和 getter 同步,因为它们只能从 EDT 访问。所以让我们退后一步。您说过将从 EDT 访问 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);

关于multithreading - 事件调度线程绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com