我想请教一下。因为我不是很有经验的 C++ 用户。我对线程知之甚少 - 但我在 Android 方面做了很多工作,所以我知道总体思路。
我需要一次写入 8 个 *.wav 文件。我经常调用来自 8 个输入 channel 的即将到来的信号的回调。我需要将数据从每个 channel (录音)保存到 *.wav。这要求我每次获取新数据时都打开文件,并在其末尾写入额外的 256 个数据样本。
用 2 个输入这样做很好,但在 3 个或更多输入后,我的输入延迟开始增加。处理器滞后,所以我可能必须在某种线程中进行处理。
我认为这应该是一个很常见的问题,但我还没有学会如何处理它。有人可以向我解释正确的方法吗?有必要用吗http://www.cplusplus.com/reference/thread/thread/或者还有其他简单/优雅的图案。
最佳答案
您需要记录或保存来自8个输入 channel 的数据。
我强烈建议至少使用 8 个大缓冲区来包含数据。
当输入或后台出现停顿时,可以将数据写入文件。在将缓冲区写入文件之前等待收集大量数据。文件 I/O 喜欢处理大数据 block 而不是许多小数据 block 。您始终可以刷新告诉操作系统写入文件的输出流。
如果你想玩线程,我建议至少三个。
线程 1 -- 读取输入 channel 并存储在缓冲区中。
线程 2 -- GUI
线程 3——将缓冲区写入文件。
请记住,线程 1 的优先级最高。当它发现缓冲区中剩余的空间量很少时,它应该唤醒线程 3 以将缓冲区写出到文件中。
您应该为每个输入 channel 至少保留 2 个缓冲区。这称为双缓冲,允许线程 3 将缓冲区写入文件,而线程 1 将输入 channel 数据读入另一个缓冲区。
关于c++ - 一次处理许多流操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28311644/