2016-02-26 111 views
1

我是新来的内存映射,我想要做的是在许多线程之间共享一个映射文件,为此我需要创建映射文件并使用函数:MapViewOfFile因此每个线程都可以访问部分文件,当然我需要将视图的偏移量发送给每个线程,以保证分配粒度。但是我不明白的部分是:dwFileOffsetHigh & dwFileOffsetLow。 MSDN说:如何在地图文件视图中设置dwFileOffsetHigh&dwFileOffsetLow值?

高偏移量和低偏移量的组合必须指定文件映射内的偏移量。

那么我怎样才能设置这两个参数的值,以便他们可以指定正确的偏移量。我是否需要进行任何计算或者只是使用变量,而系统处理其余部分(找到偏移量)?,我真的被这个问题困住了,每次我尝试一次就会得到一个异常。假设我知道每个视图的偏移量和大小,我怎么可能知道这些参数的值?一个例子值得一千个解释。这里是我想要做的解释:

// 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);` 

感谢您的回答。

+0

您是映射物理文件还是只映射内存的缓冲区?如果后者和/或映射整个文件,您通常只会传递零个文件偏移量。 –

+0

不,我说这是一个多线程应用程序,所以每个线程写入数据从一个不同的偏移量开始,如果我通过零的文件偏移量,每个线程将写入数据抵消0.我映射的物理文件。 – Safa

+0

这不是我会推荐的。国际海事组织,你应该在所有线程中使用相同的映射 - 你甚至可以使用相同的'数据'指针 - 只是在每个线程中抵消它。例如。线程1:数据[0] ...,线程2:数据[10000] ...等。 –

回答

1

如果文件< = 2GB的,可以通过期望的偏移给每个线程作为DWORD然后每个线程可以指定其直接偏移dwFileOffsetLow并设置dwFileOffsetHigh为0

pView := MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, offset, size); 

如果您的文件大小大于2GB,请将所需的偏移量作为Int64UInt64传递给每个线程,然后使用ULARGE_INTEGER变量将值分解为其低和高分量,然后将其分配给dwFileOffsetLowdwFileOffsetHigh

var 
    ul: ULARGE_INTEGER; 

ul.QuadPart := offset; 
pView := MapViewOfFile(hMapping, FILE_MAP_WRITE, ul.HighPart, ul.LowPart, size); 
+0

谢谢,这对我来说工作得很好。最后一个问题,在这两种情况下实现第二种方法(ULARGE_INTEGER)是可以的:file <= 2GB和file> 2GB,因为我正在处理不同大小的文件。或者我应该先获取文件大小并决定使用哪种方法? – Safa

+0

您可以使用'ULARGE_INTEGER'。对于小于2GB的大小,其“HighPart”将为0。 –

相关问题