目的
就是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的帮