2014-05-21 37 views
1

我有一個通過USB與外部設備進行通信的應用程序。它在後臺工作,並定期檢查設備是否連接到USB並開始從中讀取數據。當設備連接時,應用程序還向用戶顯示一個窗口。安裝該應用程序每個用戶在啓動時,用戶登錄該應用程序是用C++使用QT和適用於Windows和Mac OS X如何檢查進程的所有者是否是當前登錄的用戶? (QT應用程序)

的問題是,如果用戶安裝了應用程序和登錄在同一時間(例如,通過「切換用戶」功能),有2個應用程序正在運行,並且它們都將開始與設備進行通信,這會導致數據損壞。

我想執行一個檢查,防止應用程序啓動通信,如果該進程的所有者當前不活動。然後,只有活動用戶啓動的實例纔會與設備進行通信(假設只有一個用戶可以活動,但對個人電腦來說沒問題)。理想情況下,我很高興看到基於QT的解決方案可以在Windows和OS X上運行,但平臺特定的解決方案也可以。

我想知道如果一個解決方案,激活應用程序的窗口和檢查後,如果窗口是活動的,將工作。

最好的問候, 米哈爾

+0

您可能會想到將GUI和設備通信方面分離爲單獨的進程,後者是一個系統服務。您可以查看[qtservice](https://qt.gitorious.org/qt-solutions/qt-solutions/source/fd22bee22274975c56f1c10d87ee9fd2c0818f83:qtservice)解決方案。 –

回答

0

可以使用QSystemSemaphore同步訪問USB設備。

否則,您可以將其與QSharedMemory結合起來,以更準確地協調訪問。

+0

QSharedMemory似乎不適用於不同的用戶帳戶 - http://www.qtcentre.org/threads/19205-QSharedMemory-in-processes-from-different-accounts和https://bugreports.qt-project.org/browse/QTBUG-9446 –

+0

@MichałFronczyk對於IOS問題,您可以使用解析爲正確的共享內存的本地密鑰 –

+0

好的,我會檢查是否不存在任何其他解決方案。這將阻止應用程序同時與設備進行通信,但這兩個應用程序仍然會處理數據並顯示窗口,並且我希望其中一個應用程序能夠完美地完成此操作。 –

0

儘管在OSX上存在函數QGuiApplication :: sessionId(),它將返回一個空字符串。

有關如何處理多用戶會話的OSX docs指南。

你需要的是當前的會話ID。當用戶登錄並啓動應用程序時,檢索當前會話ID並將其存儲在應用程序中。這裏是你如何可以獲取會話ID: -

#include <security/AuthSession.h> 

unsigned int GetSessionId() const 
{ 
    OSStatus error; 
    SecuritySessionId mySession; 
    SessionAttributeBits sessionInfo; 

    error = SessionGetInfo(callerSecuritySession, &mySession, &sessionInfo); 

    if(error != errSessionSuccess) 
    { 
     qDebug() << "Error retrieving session info"); 
     return 0; 
    } 

    return mySession; 
} 

您將需要包括安全框架項目中的文件(的.pro): -

LIBS += -framework Security 

所以,當應用程序需要溝通使用USB設備,檢索存儲的會話ID並將其與當前的ID進行比較,再次調用GetSessionId。如果它們不相等,則應用程序不會從當前登錄的會話運行,並且可以跳過該讀取,從而允許其他應用程序實例繼續。

假設QGuiApplication :: sessionId()在Windows中按預期工作,您可以使用它。

相關問題