2012-08-11 67 views
1

例如,我們有一個TextEditor應用程序。像記事本++。我們有標籤顯示哪些文件內容。
OS中的默認文本編輯器設置爲TextEditor應用程序。當我們打開一個新的文件應用程序時,添加了一個標籤並將內容添加到它。
如何讓應用程序在Qt中打開一個新文件時不運行新實例?
你認爲哪種方法最好?如何使應用程序在Qt中打開一個新文件時不運行新實例?

+3

看一看http://stackoverflow.com/questions/5006547/qt-best-practice-for-a-single-instance-app-protection。 – 2012-08-11 13:44:42

+0

感謝您的回覆! – 2012-08-11 19:03:20

回答

0

問題是如何製作單實例應用程序。當您打開文件時,操作系統將打開關聯的應用程序,並將其作爲命令行參數提供給該文件。您不能簡單地通過操作系統機制將「打開文件」命令委託給正在運行的應用程序,您必須自行實施。

在AppWhirr項目中,我們使用QLocalServer/Client在實例之間進行通信:當AppWhirr應用程序執行時,它檢查是否已經使用了帶有修復ID的QLocalServer。如果不是這個應用程序的實例是第一個/唯一運行的實例。如果ID已被使用它意味着應用程序的另一個實例已經在運行,所以這第二個實例只會做兩件事情:通過Qt的本地客戶機/服務器通信發送給定的輸入參數的其他實例,當它成功地完成了通信它會退出(二審)。

這對問題的一個解決方案,需要相當多的編碼,我不會推薦它,如果你不希望使用其他的事本地客戶端/服務器通信,但它是一個可行的解決方案。

另一種解決方案是,應用程序的第一個實例在固定位置創建一個文本文件並寫入我們的實例ID。之後,第二個實例可以讀取文本文件並將消息發送到指定的ID。當然,第一個實例必須在退出時刪除文本文件,並且可能必須在第一個實例崩潰的情況下實施一些故障安全代碼來刪除文本文件。此解決方案將使用比第一個更少的資源,但需要故障安全清理代碼。

或者你可以使用第三方解決方案,如@Matteo意大利第三個選擇建議。

相關問題