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();  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM