QT之防止程序重复运行方法

来源:互联网 发布:什么录屏软件好 编辑:程序博客网 时间:2024/05/16 18:33

最近在做一个项目,添加了一个功能:防止一个程序能够重复启动。

包括Windows平台和Linux平台,其中Q_OS_WIN32宏用来表示编译运行的目标平台是windows,Q_OS_LINUX则标示目标为linux。

实现的思想是:对windows和linux分别采取了全局互斥变量和文件锁的方法。

实现方法:

#if defined Q_OS_WIN32   //for win#include <windows.h>bool checkOnly(){    //  创建互斥量    HANDLE m_hMutex  =  CreateMutex(NULL, FALSE,  L"fortest_abc123" );    //  检查错误代码    if  (GetLastError()  ==  ERROR_ALREADY_EXISTS)  {      //  如果已有互斥量存在则释放句柄并复位互斥量     CloseHandle(m_hMutex);     m_hMutex  =  NULL;      //  程序退出      return  false;    }    else        return true;}#endif#if defined  Q_OS_LINUX   //for linux#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>bool checkOnly(){    const char filename[]  = "/tmp/lockfile";    int fd = open (filename, O_WRONLY | O_CREAT , 0644);    int flock = lockf(fd, F_TLOCK, 0 );    if (fd == -1) {            perror("open lockfile/n");            return false;    }    //给文件加锁    if (flock == -1) {            perror("lock file error/n");            return false;    }    //程序退出后,文件自动解锁    return true;}#endif

测试:

int main(int argc, char *argv[]){    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));    Q_INIT_RESOURCE(wisdpsclient);    QApplication app(argc, argv);    //检查程序是否 已经启动过    if(checkOnly()==false)        return 0;    Test dialog;    dialog.show();    return app.exec();}


2 0
原创粉丝点击