0

我有一个程序,我想在其中绘制不断更新的数据(顺便说一下,它是 microhpone-line-data)。数据是一个 8000 长度的双精度数组,我并不真正关心在绘制方法之间被覆盖的“丢失”数据。

在我幼稚的实现中,很明显存在同步问题,即在绘画例程正在进行时更新音频数据。

我也知道我在 Java 和它的并发包上有点过时了,但我的第一反应是在共享数据代码周围放置同步块。不出所料,这有时会阻塞图形线程,所以我认为可能有更好的方法来做到这一点。

本质上,我只是没有太多同步方面的经验,并且在某处搞砸了一些事情。我想知道对这些问题有更好理解的人是否能够提出一个更优雅的解决方案,不会阻塞图形线程?

我天真的代码:

Object lock = new Object();
double[] audio = new double[8000]

// array size is always exactly 8000
public update( double[] audio ) {
    synchronized( lock ) {
       this.audio=audio; // and some brief processing
    }
    repaint();
}

public void paint( Graphics g ) {
    synchronized( lock ) {
        // draw the contents of this.audio
    }
}
4

1 回答 1

0

自我回答,除非一些更聪明的人可以提供更好的东西,我只是在例程开始时保存对音频数组的引用并从中提取,然后对音频缓冲区的任何更新在一个单独的数组中进行计算,然后只需一步即可将 this.audio 分配给新数组。

它似乎可以工作,尽管绘制程序确实偶尔会出现闪烁,但它并不像以前那样,由于同步阻塞,它在大约 10% 的时间里非常明显地闪烁。音频数据也不会在绘图例程的中途更新。所以...问题解决了。大概。

double[] audio = new double[8000]

// array size is always exactly 8000
public update( double[] audio ) {
   // do any brief processing
   this.audio=audio; // the reference is re-assigned in one step

repaint();
}

public void paint( Graphics g ) {
    audioNow = this.audio; // save the reference
    // draw the contents of audioNow (not this.audio)
}
于 2012-12-01T21:38:53.150 回答