当前位置: 代码迷 >> QT开发 >> Qt上程序要实现单实例,用什么方法比较好
  详细解决方案

Qt上程序要实现单实例,用什么方法比较好

热度:22   发布时间:2016-04-25 04:05:09.0
Qt下程序要实现单实例,用什么方法比较好?
我以前在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最好用。
  相关解决方案