一次处理许多流操作
Handling many ofstream operations at once
我想请教一下。因为我不是很有经验的 C++ 用户。我对线程缺乏一点了解 - 但我在 Android 中做了很多工作,所以我知道总体思路。
我需要一次写入 8 个 *.wav 文件。我经常调用来自 8 个输入通道的即将到来的信号的回调。我需要将数据从每个通道(录音)保存到 *.wav。这要求我每次获取新数据时都打开文件,并在其末尾写入额外的 256 个数据样本。
用 2 个输入这样做很好,但在 3 个或更多输入后,我的输入延迟开始增加。处理器滞后,所以我可能必须在某种线程中进行处理。
我认为这应该是一个很普遍的问题,但我还没有学会如何处理它。有人可以向我解释正确的方法吗?是否有必要使用它 http://www.cplusplus.com/reference/thread/thread/ 或是否有任何其他 simple/elegant 模式。
您需要记录或保存来自8个输入通道的数据。
我强烈建议至少使用 8 个大缓冲区来包含数据。
当输入或后台出现停顿时,您可以将数据写入文件。在将缓冲区写入文件之前等待收集大量数据。文件 I/O 喜欢处理大数据块而不是许多小数据块。您始终可以刷新告诉 OS 写入文件的输出流。
如果你想玩线程,我建议至少三个。
线程 1 -- 读取输入通道并存储在缓冲区中。
线程 2 -- GUI
线程 3——将缓冲区写入文件。
请记住,线程 1 的优先级最高。当它看到缓冲区中剩余少量 space 时,它应该唤醒线程 3 以将缓冲区写出到文件中。
您应该为每个输入通道至少保留 2 个缓冲区。这称为双缓冲,允许线程 3 将缓冲区写入文件,而线程 1 将输入通道数据读入另一个缓冲区。
我想请教一下。因为我不是很有经验的 C++ 用户。我对线程缺乏一点了解 - 但我在 Android 中做了很多工作,所以我知道总体思路。
我需要一次写入 8 个 *.wav 文件。我经常调用来自 8 个输入通道的即将到来的信号的回调。我需要将数据从每个通道(录音)保存到 *.wav。这要求我每次获取新数据时都打开文件,并在其末尾写入额外的 256 个数据样本。
用 2 个输入这样做很好,但在 3 个或更多输入后,我的输入延迟开始增加。处理器滞后,所以我可能必须在某种线程中进行处理。
我认为这应该是一个很普遍的问题,但我还没有学会如何处理它。有人可以向我解释正确的方法吗?是否有必要使用它 http://www.cplusplus.com/reference/thread/thread/ 或是否有任何其他 simple/elegant 模式。
您需要记录或保存来自8个输入通道的数据。
我强烈建议至少使用 8 个大缓冲区来包含数据。
当输入或后台出现停顿时,您可以将数据写入文件。在将缓冲区写入文件之前等待收集大量数据。文件 I/O 喜欢处理大数据块而不是许多小数据块。您始终可以刷新告诉 OS 写入文件的输出流。
如果你想玩线程,我建议至少三个。
线程 1 -- 读取输入通道并存储在缓冲区中。
线程 2 -- GUI
线程 3——将缓冲区写入文件。
请记住,线程 1 的优先级最高。当它看到缓冲区中剩余少量 space 时,它应该唤醒线程 3 以将缓冲区写出到文件中。
您应该为每个输入通道至少保留 2 个缓冲区。这称为双缓冲,允许线程 3 将缓冲区写入文件,而线程 1 将输入通道数据读入另一个缓冲区。