防止多开传统的做法有文件锁(如Eclipse的.lock文件), 进程间通信等.
但是使用文件锁方式原实例无法知晓有新实例试图启动, 从而置顶自己的窗口.
进程间通信可以使用共享内存. 如使用启动中的腾讯qq来登录qq音乐.也可以使用server, socket这样讨巧的方法
Qt本身没有提供一个跨平台的防多开解决方案, 官方推荐的QSingleApplication解决方案并不包含在Qt的library中,并且貌似是遵从商业协议而非社区版本. 所以需要我们自己来实现一个.
使用共享内存和文件锁的一个缺点是,程序一旦异常退出, 可能导致下一次无法正常启动 (还记得要去手动删除Eclipse的.lock文件的时候吧)
而使用QLocalServer和QLocalSocket结合QSharedMemory可以很好的实现多开的检查以及对先前实例的唤醒.
参考链接:http://www.qtcentre.org/wiki/index.php?title=SingleApplication#Introduction
我的实际例子
// singleApplication.h
#ifndef SINGLEAPPLICATION_H
#define SINGLEAPPLICATION_H
#include <QApplication>
#include <QSharedMemory>
#include <QLocalServer>
#include "dlgmain.h"
class SingleApplication : public QApplication
{
Q_OBJECT
public:
explicit SingleApplication(int &argc, char* argv[], const QString uniqueKey);
bool isRunning();
bool sendMessage(const QString & message);
public slots:
void receiveMessage();
void showMainWindow();
signals:
void messageAvailable(QString message);
private:
bool _isRunning;
QString _uniqueKey;
QSharedMemory sharedMemory;
QLocalServer* localServer;
static const int timeout = 1000;
};