我是内存映射的新手,我想做的是在许多线程之间共享一个映射文件,为此我需要创建映射文件并使用函数: MapViewOfFile
,以便每个线程都可以访问文件的一部分,当然我需要将视图的偏移量发送到每个尊重分配粒度的线程。但我不明白的部分是:dwFileOffsetHigh & dwFileOffsetLow。MSDN 说:
高偏移量和低偏移量的组合必须在文件映射中指定偏移量。
那么我怎样才能以一种可以指定正确偏移量的方式设置这两个参数的值。我是否需要进行任何计算或仅使用变量,系统会处理其余部分(查找偏移量)?,我真的被困住了,每次我尝试时都会得到异常。因此,假设我知道每个视图的偏移量和大小,我怎么可能知道这些参数的值呢?一个例子胜过一千种解释。以下是我正在尝试做的事情的解释:
// The main thread create map file and specify the view for every worker thread:
WorkerThreads[i] := WorkerThread.create(...,bloc_offset,bloc_size,...); // So each worker writes in a specified view.
//The worker thread then opens the view and writes data in:
data := mapViewOfFile(mapfileH, FILE_MAP_WRITE, dwFileOffsetHigh, dwFileOffsetLow, blocSize);`
感谢您的回答。
如果文件的大小为 <= 2GB,则可以将所需的偏移量作为DWORD
传递给每个线程,然后每个线程可以直接将其偏移量分配给dwFileOffsetLow
并将dwFileOffsetHigh
设置为 0。
pView := MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, offset, size);
如果您的文件大小> 2GB,请将所需的偏移量作为 Int64
或 UInt64
传递给每个线程,然后使用 ULARGE_INTEGER
变量将值分解为其低分量和高分量,然后将其分配给 dwFileOffsetLow
和 dwFileOffsetHigh
。
var
ul: ULARGE_INTEGER;
ul.QuadPart := offset;
pView := MapViewOfFile(hMapping, FILE_MAP_WRITE, ul.HighPart, ul.LowPart, size);