一次处理许多流操作

时间:2015-02-04 00:56:16

标签: c++ multithreading stream wav

我想征求意见。因为我不是很有经验的C ++用户。我对线程缺乏了解 - 但我在Android上做了很多,所以我知道一般的想法。

我需要一次写8 * .wav文件。我有一个非常频繁的回调,来自8个输入通道的即将发出的信号。我需要将数据保存到每个频道的* .wav(录制)。这要求我每次获取新数据时打开文件,并在其末尾写入额外的256个数据样本。

使用2个输入这样做很好,但是在3个或更多之后我的输入延迟开始增加。处理器滞后所以我可能需要在某种线程中执行此操作。

我认为这应该是很常见的问题,但我还没有学会如何处理它。有人可以解释我正确的方法吗?是否有必要使用http://www.cplusplus.com/reference/thread/thread/或者是否还有其他简单/优雅的模式。

1 个答案:

答案 0 :(得分:1)

您需要记录或保存来自8个输入通道的数据 我强烈建议至少使用8个大缓冲区来包含数据。

当输入或后台暂停时,您可以将数据写入文件。在将缓冲区写入文件之前等待大量数据收集。文件I / O喜欢处理大块数据而不是许多小数据。您始终可以刷新输出流,告知操作系统写入文件。

如果您想玩线程,我建议至少使用3个 线程1 - 读取输入通道并存储在缓冲区中 线程2 - GUI
线程3 - 将缓冲区写入文件。

请记住,线程1是最高优先级。当它看到缓冲区中剩余的空间很少时,它应该唤醒线程3以将缓冲区写出到文件中。

每个输入通道应至少保留2个缓冲区。这称为双缓冲,允许线程3将缓冲区写入文件,而线程1将输入通道数据读入另一个缓冲区。