天天看點

使Qt程式隻運作一個執行個體

版權聲明

本文為原創作品,請尊重作者的勞動成果。轉載必須保持文章完整性,并以超連結形式注明原始作者“ tingsking18 ”和 主站點 位址,友善其他朋友提問和指正。

讓應用程式隻運作一個執行個體,這個問題很古老了。以及以前 HGR 老胡寫過操作 event 的 delphi 版本的。當然在 win 下這樣的解決方案還是很多的。

讓 Qt 程式隻運作一個執行個體,當然用 win 下的 native API 是很不靠譜的,因為這樣會犧牲掉 Qt 跨平台的特性。是以我給出下面兩種解決方案。原理上就是程序間通訊。 QSingleApplication 用的而是 socket ,而我使用的是共享記憶體。

1.       使用 QSingleApplication 。

QSingleApplication 是 Qt 提供的一個 solution ,它不包含在 Qt 的 library 中。遵循 LGPL 協定。關于如何使用,下載下傳了這個 solution 之後,裡面有例子。還有, QtCreator 中還用到了它。你也可以翻一番 QtCreator 的源代碼。

2.       使用共享記憶體。

// 確定隻運作一次

QSystemSemaphore sema("JAMKey",1,QSystemSemaphore::Open);

sema.acquire();// 在臨界區操作共享記憶體   SharedMemory

QSharedMemory mem("SystemObject");// 全局對象名

if (!mem.create(1))// 如果全局對象以存在則退出

{

    QMessageBox::information(0, MESSAGEBOXTXT,"An instance has already been running.");

    sema.release();// 如果是 Unix 系統,會自動釋放。

    return 0;

}

sema.release();// 臨界區