為了使QT 能保證只創建一個實例來進行, 對windows和linux分別采取了全局互斥變量和文件鎖的方法。
Q_OS_WIN32宏用來表示編譯運行的目標平台是windows,Q_OS_LINUX則標示目標為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();
- }