2011-02-05 51 views
1

這應該不是一個不尋常的問題,但我在谷歌或其他搜索機器上找不到任何關於它的任何信息。控制多個程序實例 - 打開多個文件問題

所以,我用C++和QtCreator做了一個應用程序。我爲應用程序的項目文件創建了一個新的MIME類型。 我的系統(Ubuntu的10.10),當我右擊一個文件,我選擇「打開方式‘默認應用程序’的」運行

代碼:

default_application路徑/到/的/選擇/文件1

因此,如果您選擇多個文件,選擇「打開方式‘默認應用程序’」系統會調用

代碼:

default_application路徑/到/的/選擇/文件1
default_application路徑/到/的/選擇/文件2
default_application路徑/到/的/選擇/文件3

所以,這是一個大問題對我來說,因爲我在程序內部處理併發進程,所以當另一個程序實例運行時,會出現一條警告消息。因此,每個應用程序的調用都會將其他人識別爲當前正在運行的應用程序,並顯示該消息。我會擁有3個消息說,該計劃的另一個進程正在運行--_--」 我的應用程序處理多個網址是這樣的:

代碼:

MYAPP路徑/到/的/ selected/file1 path/to/the/selected/file2 path/to/the/selected/file3

我該如何讓我的代碼同時處理所有這些多個實例?我用盡了一切失敗,因爲我什麼都試過,需要從一審檢查調用,這太慢等情況來應用和所有一起

那麼,如何警示大約同一程序的併發進程我能解決這個問題嗎?是系統依賴的,還是我可以用代碼做些事情?

回答

1

的方法是使你的應用程序認識到,已經有一個實例運行,使新的實例只是期待第一個實例的請求垂死:)


編輯前:

的這樣做的方法是讓您的第一個應用程序實例像服務器一樣運行。僞算法是這樣的:

start(); 

try_to_contact_master_server_instance(); 
if(no_master()) 
{ 
    I_am_master(); 
    start_listening_server_that_wait_for_requests(); 
} 
else 
{ 
    send_request_to_master("open file path/to/the/selected/file1"); 
    send_request_to_master("open file path/to/the/selected/file2"); 
    send_request_to_master("open file path/to/the/selected/file3"); 
    die(); 
} 

handle_incoming_requests(); 

我希望它更清楚?告訴我,如果你需要更多的精度...

對於服務器部分,你可以自己做或使用由操作系統提供的一些軟件總線,如dbus或其他,但它使你的應用程序依賴,當然。

my2c

+0

我認識這位朋友。但爲了讓第一個實例告訴第二個實例已經第一次運行,第二個實例已經開始運行了! – 2011-02-08 18:36:36