您当前的位置: 首页 >  qt

wendy_ya

暂无认证

  • 6浏览

    0关注

    342博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt实战案例(57)——实现Qt防止程序启动两次功能

wendy_ya 发布时间:2022-09-20 20:04:24 ,浏览量:6

目录
    • 一、项目介绍
    • 二、项目基本配置
    • 三、UI界面设置
    • 四、主程序实现
      • 4.1 windows系统
      • 4.2 linux系统
    • 五、效果演示

一、项目介绍

本文介绍利用Qt实现防止程序启动两次的方法。 为了使QT 能保证只创建一个实例来进行, 对windows和linux分别采取了全局互斥变量和文件锁的方法。

Q_OS_WIN32宏用来表示编译运行的目标平台是windows操作系统,Q_OS_LINUX则表示目标为linux操作系统。

二、项目基本配置

新建一个Qt案例,项目名称为“StartTest”,基类选择“QWidget”,取消选中创建UI界面复选框,完成项目创建。

三、UI界面设置

UI界面如下:

无UI界面

四、主程序实现 4.1 windows系统

代码如下:

#if defined Q_OS_WIN32   //for win  
#include   
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

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();
4.2 linux系统

代码如下:

#if defined  Q_OS_LINUX   //for linux  
#include   
#include   
#include   
#include   
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();
五、效果演示

完整效果如下: 完整效果即防止程序启动两次,程序智能启动一次。

ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

关注
打赏
1659256378
查看更多评论
立即登录/注册

微信扫码登录

0.0365s