背景

在写播放器的时候,需要实现一个功能:支持多实例启动,但只让首次启动的实例最大化显示。为了让后续启动的进程能够感知到"已经有实例在运行",这里使用 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;
                
                	}
                
                
                ...........
                
                
                
                };