随笔 - 741  文章 - 0  评论 - 260  阅读 - 416万

QT防止程序启动两次的方法

为了使QT 能保证只创建一个实例来进行, 对windows和linux分别采取了全局互斥变量和文件锁的方法。

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

  1. #if defined Q_OS_WIN32   //for win  
  2. #include <windows.h>  
  3. bool checkOnly()  
  4. {  
  5.     //  创建互斥量  
  6.     HANDLE m_hMutex  =  CreateMutex(NULL, FALSE,  L"fortest_abc123" );  
  7.     //  检查错误代码  
  8.     if  (GetLastError()  ==  ERROR_ALREADY_EXISTS)  {  
  9.       //  如果已有互斥量存在则释放句柄并复位互斥量  
  10.      CloseHandle(m_hMutex);  
  11.      m_hMutex  =  NULL;  
  12.       //  程序退出  
  13.       return  false;  
  14.     }  
  15.     else  
  16.         return true;  
  17. }  
  18. #endif  
  19. #if defined  Q_OS_LINUX   //for linux  
  20. #include <sys/types.h>  
  21. #include <sys/stat.h>  
  22. #include <fcntl.h>  
  23. #include <unistd.h>  
  24. bool checkOnly()  
  25. {  
  26.     const char filename[]  = "/tmp/lockfile";  
  27.     int fd = open (filename, O_WRONLY | O_CREAT , 0644);  
  28.     int flock = lockf(fd, F_TLOCK, 0 );  
  29.     if (fd == -1) {  
  30.             perror("open lockfile/n");  
  31.             return false;  
  32.     }  
  33.     //给文件加锁  
  34.     if (flock == -1) {  
  35.             perror("lock file error/n");  
  36.             return false;  
  37.     }  
  38.     //程序退出后,文件自动解锁  
  39.     return true;  
  40. }  
  41. #endif  
  42. int main(int argc, char *argv[])  
  43. {  
  44.     QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));  
  45.     QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));  
  46.     Q_INIT_RESOURCE(wisdpsclient);  
  47.     QApplication app(argc, argv);  
  48.     //检查程序是否 已经启动过  
  49.     if(checkOnly()==false)  
  50.         return 0;  
  51.     Test dialog;  
  52.     dialog.show();  
  53.     return app.exec();  
posted on   莫水千流  阅读(2703)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示