#include "widget.h"
#include <QApplication>
#include <QSharedMemory>
#include <QDebug>
#include <QProcess>
QSharedMemory g_sharedMemory;
bool checkSingleInstance(QSharedMemory& sharedMemory)
{
static const QString APP_ID("com.apple.zhibo.douyu_app_id");
sharedMemory.setKey(APP_ID);
if (sharedMemory.attach())//将当前进程添加到此共享内存中,如果程序第一次启动,那么这个共享内存暂未创建,所以写入失败继而创建共享内存,在此进程未结束时,再次启动程序,则会进入;
{
qDebug() << "已有进程在运行,将其激活1";
return false;
}
if (sharedMemory.create(1)) //创建共享内存
{
return true;
}
qDebug() << "已有进程在运行,将其激活2";
return false;
}
void exitApp()
{
int pid = qApp->applicationPid();
QString killCmd;
#if defined(Q_OS_MACOS)
killCmd = QString("kill -9 %1").arg(pid);
#elif defined(Q_OS_WINDOWS)
killCmd = QString("taskkill /pid %1 /f").arg(pid);
#endif
//LOG_INFO << "exit application.";
g_sharedMemory.detach();
QProcess::startDetached(killCmd);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (!checkSingleInstance(g_sharedMemory))
{
return 1;
}
Widget w;
w.show();
return a.exec();
}
QShareMemory参考资料:
https://blog.csdn.net/ddllrrbb/article/details/82729671