我以前在BC下使用的是原子法,这个方法在Windows以外的OS中肯定不能用了。
那一般标准用哪种方式呢?
我看到网上有说:QLocalSocket,QLocalServer 方法的。
------解决方案--------------------
一般本人用最笨的办法,建个文件,有这个文件说明就有一个程序在运行。程序关闭了就删除文件。
内存文件也可。
------解决方案--------------------
windows下一般创建一个核心对象 启动时 先检查是否已经有同名的核心对象存在 如存在 则认为进程已经起来了
linux下一般启动后 会将当前的pid写入一个.pid文件里 然后下次启动的时候
给.pid文件里的进程号发一个kill -0 的信号量 表示检测对应的进程号是否存在
------解决方案--------------------
去看本人的博客:http://blog.csdn.net/feilinhe/article/details/5517637
------解决方案--------------------
http://doc.qt.digia.com/solutions/4/qtsingleapplication/qtsingleapplication.html
#include <QtGui/QApplication>
#include <QSharedMemory>
#include <QDebug>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
int ret = 0;
QSharedMemory sharedMemory("UniqueNameForApplication");
if (sharedMemory.create(1) && sharedMemory.error() != QSharedMemory::AlreadyExists)
{
qDebug() << "This is the only instance";
QApplication a(argc, argv);
MainWindow w;
w.show();
ret = a.exec();
}
else
{
qDebug() << "This is not the first instance";
}
return ret;
}
------解决方案--------------------
http://bbs.csdn.net/topics/390268072
这个帖子里我回答过。。。
Qt下实现单实例,可以使用QSignalApplication和QSharedMemory,但是QSignalApplication好像是Qt商业版里才有,另外Linux下用DBUS,或者在启动程序的时候使用系统API查询进程,看是否已经运行。
------解决方案--------------------
sharememory就好了,
------解决方案--------------------
楼上说了那么多方法,我觉得还是QSharedMemory最好用。