背景
在写播放器的时候,需要实现一个功能:支持多实例启动,但只让首次启动的实例最大化显示。为了让后续启动的进程能够感知到"已经有实例在运行",这里使用 Qt 提供的 QSharedMemory 做进程间通信。
思路
基本做法是:首次启动的进程创建一块共享内存并写入一个标记值,后续启动的进程尝试读取这块共享内存,根据标记值判断是否需要通知已有实例。下面是简化后的 ShareMem 封装类。
示例代码
..
class ShareMem
{
public:
QSharedMemory*share;
char data;
~ShareMem()
{
share->detach();
delete share;
}
ShareMem()
{
share=new QSharedMemory("shareMem");
data = 2;
cout << " create shareMem status : "<<share->create(1, QSharedMemory::ReadWrite) << endl;;
share->lock();
memcpy((char*)share->data(), &data, 1));
share->unlock();
//share->detach();
//delete share;
}
bool isNotify()
{
QSharedMemory share;
share.setKey("shareMem");
share.attach();
share.lock();
memcpy(&data,share.data() , 1);
share.unlock();
share.detach();
if (data== 2)return false;
share.attach();
share.lock();
data = 2;
memcpy((char*)share.data(), &data, 1);
share.unlock();
share.detach();
return true;
}
...........
};