0

假设我有两个片段:FragA 和 FragB。

FragB 在 FragA 内部。在 FragA 中,有一个 rec 按钮,按下该按钮将启动一个新线程(ThreadA),该线程将开始使用 AudioRecord 录制音频并将音频数据保存到缓冲区。在 FragB 中有另一个线程 (ThreadB) 需要实时使用来自 ThreadA 的缓冲区数据。

如何将缓冲区数据从 ThreadA 实时发送到 ThreadB?

4

3 回答 3

1

我不知道你在哪里有线程 B。但是如果你想让两个线程共享同一个数据缓冲区,那么你可以为缓冲区创建一个类变量,并在同一个类中创建两个线程。这样他们就可以使用同一个缓冲区进行读写来自不同的线程。

于 2013-05-03T18:24:19.640 回答
1

您可以创建一个包含数据缓冲区的类,该类在应用程序启动时被实例化。这可以传递给 Frag A(以及线程 A)和 Frag B(以及线程 B),一个可以填充另一个可以清空......

于 2013-05-04T20:44:57.057 回答
0

您可以使用管道(在 C 中,这意味着查看 pipe()、mkfifo() 等。我认为 Java 也有类似的东西)。写入线程 A 中的管道,从线程 B 中的管道读取,并依靠管道的内部缓冲区来允许两个线程具有一定程度的异步性。

这是一种懒惰的做法,也不是非常有效(数据被复制两次)。但是使用起来非常简单。

或者,您可以拥有一堆缓冲区,每个缓冲区都由一对信号量保护(您可以称它们为“已填充”和“已清空”)。线程 A 获取一个“清空”信号量,填充缓冲区并发布“填充”信号量。同时,线程 B 被阻塞,试图获取“已填充”信号量,当它解除阻塞时,它可以处理数据,然后发布“清空”信号量。然后移动到下一个缓冲区。这更有效,因为不会不必要地复制数据。可能有一个 Java 类为您预先打包了所有内容,其名称中可能包含“队列”一词。

于 2013-05-04T20:37:11.507 回答