QSharedMemory 類

The QSharedMemory 類提供對共享內存段的訪問。 更多...

頭: #include <QSharedMemory>
qmake: QT += core
Since: Qt 4.4
繼承: QObject

公共類型

enum AccessMode { ReadOnly, ReadWrite }
enum SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, ..., UnknownError }

公共函數

QSharedMemory (const QString & key , QObject * parent = nullptr)
QSharedMemory (QObject * parent = nullptr)
virtual ~QSharedMemory ()
bool attach (QSharedMemory::AccessMode mode = ReadWrite)
const void * constData () const
bool create (int size , QSharedMemory::AccessMode mode = ReadWrite)
void * data ()
const void * data () const
bool detach ()
QSharedMemory::SharedMemoryError error () const
QString errorString () const
bool isAttached () const
QString key () const
bool lock ()
QString nativeKey () const
void setKey (const QString & key )
void setNativeKey (const QString & key )
int size () const
bool unlock ()

靜態公共成員

const QMetaObject staticMetaObject

額外繼承成員

詳細描述

The QSharedMemory 類提供對共享內存段的訪問。

QSharedMemory 提供對由多綫程、多進程共享內存段的訪問。它還為單綫程 (或單進程) 提供鎖定內存的獨占訪問手段。

當使用此類時,要意識到以下平颱差異:

  • Windows: QSharedMemory 不擁有共享內存段。當所有綫程或進程擁有實例化的 QSharedMemory (被附加到特定共享內存段) 通過銷毀其實例化的 QSharedMemory 或退齣時,Windows 內核會自動釋放共享內存段。
  • Unix: QSharedMemory 擁有共享內存段。當最後綫程 (或進程) 擁有實例化的 QSharedMemory (被附加到特定共享內存段) 從段分離通過銷毀其實例化的 QSharedMemory Unix 內核會釋放共享內存段。但是,若最後綫程 (或進程) 崩潰未運行 QSharedMemory 構函數,共享內存段在崩潰時幸存。
  • HP-UX:每進程隻允許附加一個到共享內存段。這意味著 QSharedMemory 不應用於同一 HP-UX 進程跨多個綫程。

記得鎖定共享內存采用 lock () 在讀寫共享內存之前,和記住釋放鎖采用 unlock () 在完成後。

QSharedMemory 自動銷毀共享存儲段,當最後實例化的 QSharedMemory 從段分離時,且不保留段引用。

警告: QSharedMemory 以特定 Qt 方式改變鍵,除非另外指定。與非 Qt 應用程序的互操作的達成是通過首先創建默認共享內存采用 QSharedMemory () 然後設置本機鍵采用 setNativeKey ()。當使用本機鍵時,不保護對共享內存的多次訪問 (例如:無法 lock ()) 且應該使用用戶定義機製來達成這種保護。

成員類型文檔編製

enum QSharedMemory:: AccessMode

常量 描述
QSharedMemory::ReadOnly 0 共享內存段是隻讀的。不允許寫入共享內存段。嘗試寫入采用 ReadOnly 創建的共享內存段,會導緻程序中止。
QSharedMemory::ReadWrite 1 允許讀寫共享內存段。

enum QSharedMemory:: SharedMemoryError

常量 描述
QSharedMemory::NoError 0 沒有齣現錯誤。
QSharedMemory::PermissionDenied 1 操作失敗,因為調用者沒有所需權限。
QSharedMemory::InvalidSize 2 創建操作失敗,因為請求大小無效。
QSharedMemory::KeyError 3 操作失敗,因為鍵無效。
QSharedMemory::AlreadyExists 4 A create () 操作失敗,因為具有指定鍵的共享內存段已存在。
QSharedMemory::NotFound 5 An attach () 失敗,因為找不到具有指定鍵的共享內存段。
QSharedMemory::LockError 6 試圖 lock () 共享內存段失敗,因為 create () 或 attach () 失敗和返迴 false,或因為發生係統錯誤在 QSystemSemaphore::acquire ().
QSharedMemory::OutOfResources 7 A create () 操作失敗,因為沒有足夠內存可用於填充請求。
QSharedMemory::UnknownError 8 發生其它事情且很糟糕。

成員函數文檔編製

QSharedMemory:: QSharedMemory (const QString & key , QObject * parent = nullptr)

構造共享內存對象采用給定 parent 並將其鍵設為 key 。因為有設置鍵,其 create () 和 attach () 函數可以被調用。

另請參閱 setKey (), create (),和 attach ().

QSharedMemory:: QSharedMemory ( QObject * parent = nullptr)

此函數重載 QSharedMemory ().

構造共享內存對象采用給定 parent 。由於構造函數未設置共享內存對象的鍵,因此,共享內存對象沒有附加底層共享內存段。必須設置鍵采用 setKey () 或 setNativeKey () 先於 create () 或 attach () 可以使用。

另請參閱 setKey ().

[虛擬] QSharedMemory:: ~QSharedMemory ()

析構函數清零鍵,強製共享內存對象 detach 從其底層共享內存段。若此共享內存對象是連接到共享內存段的最後一個, detach () 操作會銷毀共享內存段。

另請參閱 detach () 和 isAttached ().

bool QSharedMemory:: attach ( QSharedMemory::AccessMode mode = ReadWrite)

試圖將進程附加到共享內存段,通過傳遞給構造函數的鍵標識或調用 setKey () 或 setNativeKey ()。訪問 mode is ReadWrite 默認情況下。它還可以為 ReadOnly 。返迴 true 若附加操作成功。若返迴 false,調用 error () 以確定發生何種錯誤。在附加共享內存段後,可以獲得共享內存的指針通過調用 data ().

另請參閱 isAttached (), detach (),和 create ().

const void *QSharedMemory:: constData () const

返迴共享內存段內容的 const 指針,若有附加一個的話。否則,返迴 null。記得鎖定共享內存采用 lock () 在讀寫共享內存之前,和記住釋放鎖采用 unlock () 在完成後。

另請參閱 attach () 和 create ().

bool QSharedMemory:: create ( int size , QSharedMemory::AccessMode mode = ReadWrite)

創建共享內存段 size 字節采用傳遞給構造函數的鍵,設置采用 setKey () 或設置采用 setNativeKey (),然後附加到新共享內存段采用給定訪問 mode 並返迴 true 。若由鍵標識的共享內存段已存在,不履行附加操作和 false 被返迴。當返迴值為 false ,調用 error () 以確定發生何種錯誤。

另請參閱 error ().

void *QSharedMemory:: data ()

返迴共享內存段內容的 const 指針,若有附加一個的話。否則,返迴 null。記得鎖定共享內存采用 lock () 在讀寫共享內存之前,和記住釋放鎖采用 unlock () 在完成後。

另請參閱 attach ().

const void *QSharedMemory:: data () const

此函數重載 data ().

bool QSharedMemory:: detach ()

從共享內存段分離進程。若這是附加到共享存儲段的最後進程,則共享存儲段由係統釋放 (即:銷毀內容)。函數返迴 true 若它分離瞭共享內存段。若它返迴 false ,通常意味著段未被附加或被另一進程鎖定。

另請參閱 attach () 和 isAttached ().

QSharedMemory::SharedMemoryError QSharedMemory:: error () const

返迴指示是否發生錯誤的值,且若如此,指示錯誤是什麼。

另請參閱 errorString ().

QString QSharedMemory:: errorString () const

返迴最後發生錯誤的文本描述。若 error () 返迴 錯誤值 ,調用此函數以獲取描述錯誤的文本字符串。

另請參閱 error ().

bool QSharedMemory:: isAttached () const

返迴 true 若此進程被附加到共享內存段。

另請參閱 attach () 和 detach ().

QString QSharedMemory:: key () const

返迴的鍵賦值采用 setKey () 到此共享內存,或 null 鍵若尚未賦值鍵,或段使用的是 nativeKey ()。鍵是 Qt 應用程序用來標識共享內存段的標識符。

可以找到由操作係統使用的本機、特定平颱鍵,通過調用 nativeKey ().

另請參閱 setKey () 和 setNativeKey ().

bool QSharedMemory:: lock ()

這是鎖供此進程訪問的共享內存段的信號量,並返迴 true 。若另一進程已鎖定段,此函數阻塞直到鎖被釋放為止。然後,獲取鎖並返迴 true 。若此函數返迴 false ,意味著已忽略的 false 返迴來自 create () 或 attach (),已設置鍵采用 setNativeKey () 或 QSystemSemaphore::acquire () 失敗由於未知係統錯誤。

另請參閱 unlock (), data (),和 QSystemSemaphore::acquire ().

QString QSharedMemory:: nativeKey () const

返迴用於此共享內存對象的本機、特定平颱鍵。本機鍵是操作係統用於標識共享內存段的標識符。

可以使用本機鍵訪問 Qt 尚未創建的共享內存段,或將共享內存訪問授予非 Qt 應用程序。

該函數在 Qt 4.8 引入。

另請參閱 setKey () 和 setNativeKey ().

void QSharedMemory:: setKey (const QString & key )

設置平颱無關 key 為此共享內存對象。若 key 與當前鍵相同,函數將什麼都不做而返迴。

可以調用 key () 以檢索平颱無關鍵。在內部, QSharedMemory 將此鍵轉換成平颱特定鍵。若改為調用 nativeKey (),將獲得特定平颱的轉換鍵。

若將共享內存對象附加到底層共享內存段,它將 detach 從其,在設置新鍵之前。此函數不做 attach ().

另請參閱 key (), nativeKey (),和 isAttached ().

void QSharedMemory:: setNativeKey (const QString & key )

設置特定平颱本機 key 為此共享內存對象。若 key 與當前本機鍵相同,函數將什麼都不做而返迴。若隻想為段賦值鍵,應調用 setKey () 代替。

可以調用 nativeKey () 以檢索本機鍵。若有賦值本機鍵,調用 key () 將返迴 null 字符串。

若將共享內存對象附加到底層共享內存段,它將 detach 從其,在設置新鍵之前。此函數不做 attach ().

應用程序將不可移植,若設置本機鍵。

該函數在 Qt 4.8 引入。

另請參閱 nativeKey (), key (),和 isAttached ().

int QSharedMemory:: size () const

返迴共享內存段的附加大小。若未附加共享內存段,返迴 0。

注意: 段大小可能大於請求大小,被傳遞給 create ().

另請參閱 create () 和 attach ().

bool QSharedMemory:: unlock ()

釋放共享內存段鎖並返迴 true ,若鎖目前由此進程保持。若段未被鎖定,或鎖由另一進程所保持,則什麼也不會發生並返迴 false。

另請參閱 lock ().