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 2016-04-09 06:31  莫水千流  阅读(2696)  评论(1编辑  收藏  举报