背景

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

	}


...........



};