c++ - 一次处理许多流操作

标签 c++ multithreading stream wav

我想请教一下。因为我不是很有经验的 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/

相关文章:

C++:OpenMP 并行循环内存泄漏

c++ - 将 Thumb 函数指针转换为 int 并返回

php - 即时获取 YouTube 音频流

list - 流(无限列表)monad 模拟了哪些效果?

Java 可重入锁和条件 |生产者完成工作,消费者陷入困境

stream - 我如何每 N 秒从无界队列中提取消息并将它们生成到 Tokio 处理程序?

c++ - VS2019 : How to resolve the "unknown sub-lang: 0x8" message in Resource View?

c++ - 在 C++ 中使用 Arduino 上的数组

c# - 在 C# Winforms 中,让异步方法保证其在 UI 线程上执行的最精确方法是什么?

java - Android:无法在未调用 Looper.prepare() 运行新线程的线程内创建处理程序