gpt4 book ai didi

c++ - 如何在 C++ 中执行跨平台异步文件 I/O

转载 作者:IT老高 更新时间:2023-10-28 23:18:13 24 4
gpt4 key购买 nike

我正在编写一个需要使用大型音频多样本的应用程序,通常大小约为 50 mb。一个文件包含大约 80 个单独的短录音,我的应用程序可以随时播放这些录音。出于这个原因,所有的音频数据都被加载到内存中以便快速访问。

但是,当加载其中一个文件时,可能需要几秒钟才能放入内存,因为我需要使用 ifstream 读取大量数据,这意味着我的程序 GUI 会暂时卡住。我已经尝试过对我的文件进行内存映射,但这会导致每次我需要跳转到文件的不同区域时出现巨大的 CPU 峰值和困惑的音频,这是 Not Acceptable 。

所以这让我认为执行异步文件读取将解决我的问题,即数据在不同的进程中读取并在完成时调用函数。这需要同时兼容 Mac OS X 和 Windows 以及 C++。

编辑:不想使用 Boost 库,因为我想保留一个小的代码库。

最佳答案

boost 有一个我以前没有使用过的 asio 库(它不在 NASA 批准的第三方库列表中)。

我自己的方法是编写两次文件读取代码,一次用于 Windows,一次用于 POSIX aio API,然后选择正确的链接。

对于 Windows,使用 OVERLAPPED(您必须在 CreateFile 调用中启用它,然后在读取时传递一个 OVERLAPPED 结构)。您可以让它在完成时设置一个事件 (ReadFile) 或调用完成回调 (ReadFileEx)。您可能需要更改您的主事件循环以使用 MsgWaitForMultipleObjectsEx 以便您可以等待 I/O 事件或允许回调运行,除了接收 WM_ 窗口消息。 MSDN 有这些函数的文档。

对于 Linux,有 fadvise 和 epoll,它们将使用预读缓存,或者 aio_read,它将允许实际的异步读取请求。当请求完成时,您会收到一个信号,您应该使用它来发布 XWindows 消息并唤醒您的事件处理循环。

两者在细节上略有不同,但最终效果是相同的——您请求在后台完成的读取,然后在 I/O 完成时唤醒您的事件调度循环。

关于c++ - 如何在 C++ 中执行跨平台异步文件 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com