Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows runtime 如何使用irandomaccesstream和DataReader?_Windows Runtime_C++ Cx - Fatal编程技术网

Windows runtime 如何使用irandomaccesstream和DataReader?

Windows runtime 如何使用irandomaccesstream和DataReader?,windows-runtime,c++-cx,Windows Runtime,C++ Cx,我正在尝试制作读取文件的应用程序。文件可能大于2GB,因此我无法将其完全加载到内存中。因此,我正在为WinRT开发文件读取系统,该系统允许我: 使用部分缓冲区读取文件-加载到大小为5mb的内存块 例如,然后用户检查中是否存在所需的字节数 缓冲区 为我提供对文件的多线程访问—例如,我需要为两个断开连接的目的读取文件 由此产生的系统必须使用尽可能少的cpu、内存和hdd时间 现在,我设计了一种在1个线程中读取带有缓冲区的文件的方法,我有一些问题: 在DataReader->LoadAsync(N)和

我正在尝试制作读取文件的应用程序。文件可能大于2GB,因此我无法将其完全加载到内存中。因此,我正在为WinRT开发文件读取系统,该系统允许我:

  • 使用部分缓冲区读取文件-加载到大小为5mb的内存块 例如,然后用户检查中是否存在所需的字节数 缓冲区
  • 为我提供对文件的多线程访问—例如,我需要为两个断开连接的目的读取文件
  • 由此产生的系统必须使用尽可能少的cpu、内存和hdd时间
  • 现在,我设计了一种在1个线程中读取带有缓冲区的文件的方法,我有一些问题:

  • DataReader->LoadAsync(N)
    DataReader->ReadBytes(目标数组)
    之间会发生什么?第一个操作是否将数据装入内存,第二个操作是否将数据放入目标
  • DataReader
    (或
    irandomaccesstream
    ,我不知道具体是哪一个)将加载的数据存储在交换文件中(使用ssd驱动器捕获它:将交换放置在hdd上,第二次尝试读取相同的数据显示与hdd相同的速度)。如何避免它
  • 我设计的读取系统(
    file->buffer->user
    )是否适合
    DataReader
    irandomaccesstream

  • 问得好,你说得对

  • 是的,
    DataReader->LoadAsync(uint count)
    似乎从源(磁盘、网络、内存)复制数据并将其加载到读卡器的中间缓冲区。在开始从
    DataReader
    读取之前,请确保等待返回的
    DataReaderLoadOperation
    完成,否则将遇到一些难以调试的异常

  • DataReader
    只是为
    IRandomAcessStream
    /
    IInputStream
    ReadAsync
    方法提供了一个包装器。文件是否交换取决于
    IRandomAcessStream
    的实现。默认情况下,Windows似乎会缓存文件。我查看了
    StorageFile
    ,没有找到禁用缓存的方法,但有一种方法可以通过Win32 API来实现

  • 这个设计很好;只要您计划按顺序读取文件,而无需查找,它就可以发挥最佳效果。当查找连接到
    数据读取器
    的流时,
    数据读取器
    将在其当前内部位置继续读取。它仅在再次调用
    LoadAsync
    时更新一次。为了在多线程中使用,可以调用在指定位置创建输入流的副本,并将
    DataReader
    绑定到该位置


  • 祝您使用这个非常有文档记录的API好运。

    @yakkfyi,WinRT暗示它是C++/CX,而不是C++/CLI@LucasTrzesniewski啊,还有另一种方言吗?为misedit感到抱歉。@Yakk别担心,是的,他们制作了另一种方言(它不在CLI上运行,没有GC,因此
    gcnew
    关键字不合适,等等),但语法几乎相同:-)