- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
您好 StackOverflow 的用户。
我一直在使用 C++ 中 Win32 API 的 MapViewOfFile,我是它的新手,但我一直在尝试为 mapview 文件创建一个信号量,所以一个实例不能复制到它,除非另一个实例有已经复制到它并且主实例已经读取了它。
我的想法是创建不同的方法来做到这一点,但我需要知道最好的方法。
1) 使用 while 循环等待 mapviewfile 为空。
我尝试执行以下操作:
mapViewFile = (LPTSTR) MapViewOfFile(mapView,
FILE_MAP_ALL_ACCESS,0,0,SH_MAX_MEMORY);
if(mapViewFile!=NULL){
// Wait for the mapviewfile to be empty.
while(mapViewFile!=""); // This while is only for delay the operation and wait for the mapviewfile it's empty, we don't need any action in this while.
CopyMemory((PVOID)mapViewFile,defaultalloc,(_tcslen(defaultalloc) * sizeof(TCHAR)));
UnmapViewOfFile(mapViewFile);
}
CloseHandle(mapView);
因此,当 mapviewfile 为空时,将跳过 while 并将“辅助”实例复制到其中,然后主实例读取它并清空 mapviewfile,这会生成一个信号量。
2) 使用互斥锁
另一种方法是将 Win32 Api 中的互斥量与 CreateMutex
一起使用我还没有用过这个,但我想我可以用它做我想做的事。
所以,我的问题如下:
就是这些问题,谢谢。
最佳答案
您正在寻求同步对共享资源的访问。做到这一点的方法是使用同步对象。这意味着使用互斥体。
使用互斥量意味着您可以进行空闲等待而不是繁忙的循环。而且您也不必担心编译器会优化 while
循环中对 mapViewFile
的读取。而且,如果您有多个进程写入,那么您将遇到一场数据竞争,如果没有互斥体或等效物,您将无法解决。在这种情况下,您的第一个选择永远行不通。
顺便说一下,您需要在 while
循环测试中使用 strcmp
。这是因为 mapViewFile!=""
的计算结果始终为真。
关于c++ - MapViewOfFile 中信号量的最佳方法 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989355/
如果我在同一进程中为同一文件创建 2 个单独的映射,指针是否会共享? 换句话说: LPCTSTR filename = //... HANDLE file1 = CreateFile(filename
如果我在同一进程中为同一文件创建 2 个单独的映射,指针是否会共享? 换句话说: LPCTSTR filename = //... HANDLE file1 = CreateFile(filename
所以我试图将一个整数 a =3 从服务器端传递到客户端。问题是,当我在客户端执行消息 printf 时,显示的值不是 3,而是一个随机数(某些值)就像 19923)。我试图在服务器端通过值(&a)传递
我正在尝试使用 VS2010 在 Windows 上对文件进行内存映射。我在 DLL 中执行此操作。DLL 的第一个实例可以很好地映射文件。同一进程中的第二个实例导致 *ppvData = ::Map
我正在尝试通过共享内存为学校作业实现 IPC。我创建了一个名为 SharedMemoryBuffer 的类来处理创建文件映射和 View 。 我的 Init() 函数如下所示: BYTE * Shar
使用 win32api,我希望下面的程序创建两个进程并创建一个文件映射。 (使用 C++) 我不知道我应该在 Handle CreateFileMapping(....我试过: PROCCESS_IN
早上好,MapViewOfFile 有可能返回同一个地址两次吗?但是,UnmapViewOfFile 在必须取消映射同一地址两次时会出现错误。我们收到错误 487:地址无效。下面是一些伪代码,展示了我
我有一些使用 MapViewOfFile 共享数据的程序,但我遇到了奇怪的访问冲突,这似乎是由于访问映射文件数据造成的。 一些共享数据有指针,但是这些指针只被一个进程设置和使用,而是由进程内的多个线程
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why won't the loader load at the desired location “Map
我基本上试图将我的结构转换或复制到我的其他进程部分 View ,但我不断收到错误 C2760: syntax error: unexpected token 'identifier', expecte
我想将 MapViewOfFile 的返回值(据我所知是指向 void 的指针)“强制转换”到我自己的类,以便我能够使用该对象。我知道内存的结构。 headerSize 位于字节号 4 到字节号 8,
如何使用 CreateFileMapping 和 MapViewOfFile 将共享内存分配给静态缓冲区,如下所示。 #pragma data_seg(".ABC") __declspec (dlle
我正在尝试使用需要 DWORD 的函数。 这些是规范: dwFileOffsetHigh [in] A high-order DWORD of the file offset where the vi
您好 StackOverflow 的用户。 我一直在使用 C++ 中 Win32 API 的 MapViewOfFile,我是它的新手,但我一直在尝试为 mapview 文件创建一个信号量,所以一个实
下午好,众所周知,在处理大文件时无法映射到 Win32 中的一个 View ,创建仔细映射的代码并根据需要取消映射文件区域。 pastebin 网址是: 我创建并测试了一个处理大文件的 cMemory
``我正在努力做我的家庭作业,但我无法继续,需要你的帮助。我有两个使用相同文件 (log.txt) 的进程。当我尝试同时写一些东西时,它会覆盖并且只有一个进程写入 txt。 这是我的创作过程, ent
开发游戏(PT 中的“jogo”), 服务器最多可以同时运行 5 个游戏, 客户端将通过映射内存访问。 这就是我所拥有的: 服务器: #define MAX_JOGOS 5 typedef struc
以下代码是否会将文件中的数据加载到系统内存中,以便访问结果指针永远不会阻塞线程? auto ptr = VirtualLock(MapViewOfFile(file_map, FILE_MAP_REA
我有一个非常大的文件,我需要分成小块读取它,然后处理每一 block 。我正在使用 MapViewOfFile 函数在内存中映射一 block ,但在阅读第一部分后我无法阅读第二部分。当我尝试映射它时
只是想知道我是否正在像这样在 Windows 平台上创建共享内存阵列: HANDLE hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAG
我是一名优秀的程序员,十分优秀!