目的
就是A程序是QT的程序用的QT的接口读取共享内存,B程序是WinApi创建的共享内存,两个程序进行共享内存;
其间还有信号量,信号量,统一用的winApi的信号量。
就是下边这种情况:
下边的这个例子,就针对两块重点,进行分析:
1、QT侧的共享内存与win Api的共享内存如何共享,直接共享肯定会失败的。
2、共享内存的信号里怎么应用,才能解决,资源的冲突问题,资源的协调问题。
参考资料
https://www.cnblogs.com/lidabo/p/17222887.html
过程
内存挂载不上的问题
就是QT侧进程:
QSharedMemory sharedMemory;
sharedMemory.setKey(QString("memoryKeyForTest"));
用的这个共享内存的key,于是winApi侧的也用这一个key:
const char* shmName = "memoryKeyForTest";HANDLE hMapFile = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, shmName);if (hMapFile == NULL) {std::cerr << "CreateFileMapping failed with error " << GetLastError() << std::endl;return 1;}LPVOID lpBase = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 4096);if (lpBase == NULL) {std::cerr << "MapViewOfFile failed with error " << GetLastError() << std::endl;CloseHandle(hMapFile);return 1;}
发现两个程序总是不能通信,怎么回事,调试跟踪QT代码,发现QT的共享内存总是挂载不上,就是这段代码执行总失败:
if (!sharedMemory.isAttached()){if(!sharedMemory.attach()){qDebug("program exit!");return -1;}}
那是怎么回事,名字是一样的啊,于是,网上找资料,也没有相关明确的资料,有一个网上说:QT内部对key的名字进行了处理,那如何得到这一个名字呢?不至于,查QT 源码吧?
还是翻翻qt Api的帮