Класс QSharedMemory
Класс QSharedMemory обеспечивает доступ к сегменту общей памяти. Подробнее...
| Заголовок: | #include <QSharedMemory> |
| qmake: | QT += core |
| С момента: | Qt 4.4 |
| Наследует: | QObject |
Этот класс был представлен в Qt 4.4.
Типы публичного интерфейса
| Перечисление | AccessMode { ReadOnly, ReadWrite } |
| Перечисление | 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() |
Подробное описание
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()), и для достижения такой защиты необходимо использовать пользовательский механизм.
Документация по типам членов
Перечисление QSharedMemory::AccessMode
| Постоянная | Значение | Описание |
|---|---|---|
QSharedMemory::ReadOnly |
0 |
Сегмент общей памяти доступен только для чтения. Запись в сегмент общей памяти запрещена. Попытка записи в сегмент общей памяти, созданный с ReadOnly, приведет к аварийному завершению программы. |
QSharedMemory::ReadWrite |
1 |
Чтение и запись сегмента общей памяти разрешены. |
Перечисление QSharedMemory::SharedMemoryError
| Постоянная | Значение | Описание |
|---|---|---|
QSharedMemory::NoError |
0 |
Ошибка не произошла. |
QSharedMemory::PermissionDenied |
1 |
Операция завершилась неудачно из-за отсутствия необходимых разрешений у вызывающей стороны. |
QSharedMemory::InvalidSize |
2 |
Операция создания завершилась неудачно из-за некорректного запрошенного размера. |
QSharedMemory::KeyError |
3 |
Операция завершилась неудачно из-за некорректного ключа. |
QSharedMemory::AlreadyExists |
4 |
Операция create() завершилась неудачно, так как сегмент общей памяти с указанным ключом уже существовал. |
QSharedMemory::NotFound |
5 |
Операция attach() завершилась неудачно, так как сегмент общей памяти с указанным ключом не был найден. |
QSharedMemory::LockError |
6 |
Попытка lock() сегмента общей памяти завершилась неудачно, потому что create() или attach() завершились неудачно и вернули false, или из-за возникшей системной ошибки в QSystemSemaphore::acquire(). |
QSharedMemory::OutOfResources |
7 |
Операция 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().
[virtual] QSharedMemory::~QSharedMemory()
Деструктор очищает ключ, что принуждает объект общей памяти оторваться от его сегмента общей памяти. Если этот объект общей памяти является последним подключённым к сегменту общей памяти, операция detach() уничтожает сегмент общей памяти.
См. также detach() и isAttached().
bool QSharedMemory::attach(QSharedMemory::AccessMode mode = ReadWrite)
Попытка присоединить процесс к сегменту общей памяти, идентифицируемому ключом, переданным конструктору или в вызове setKey() или setNativeKey(). Режим доступа mode по умолчанию равен ReadWrite. Он также может быть ReadOnly. Возвращает true, если операция присоединения успешна. Если возвращается false, вызовите error(), чтобы определить, какая ошибка произошла. После присоединения сегмента общей памяти указатель на общую память можно получить, вызвав data().
См. также isAttached(), detach() и create().
const void *QSharedMemory::constData() 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()
Возвращает указатель на содержимое сегмента общей памяти, если он прикреплён. В противном случае возвращает 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() для этого объекта общей памяти, или пустой ключ, если ключ не назначен или сегмент использует nativeKey(). Ключ — это идентификатор, используемый приложениями Qt для идентификации сегмента общей памяти.
Вы можете найти системный, специфичный для платформы, ключ, используемый операционной системой, вызвав nativeKey().
См. также setKey() и setNativeKey().
bool QSharedMemory::lock()
Это семафор, который блокирует сегмент общей памяти для доступа этим процессом и возвращает true. Если другой процесс заблокировал сегмент, эта функция блокируется до тех пор, пока блокировка не будет освобождена. Затем она приобретает блокировку и возвращает true. Если эта функция возвращает 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(), вы получите специфичный для платформы, преобразованный ключ.
Если объект общей памяти подключён к базовому сегменту общей памяти, он оторвётся от него перед установкой нового ключа. Эта функция не выполняет attach().
См. также key(), nativeKey() и isAttached().
void QSharedMemory::setNativeKey(const QString &key)
Устанавливает системный, специфичный для платформы, key для этого объекта общей памяти. Если key совпадает с текущим системным ключом, функция возвращается без выполнения каких-либо действий. Если всё, что вам нужно, это назначить ключ сегменту, вы должны вызвать setKey() вместо этого.
Вы можете вызвать nativeKey(), чтобы получить системный ключ. Если системный ключ был назначен, вызов key() вернёт пустую строку.
Если объект общей памяти подключён к базовому сегменту общей памяти, он оторвётся от него перед установкой нового ключа. Эта функция не выполняет attach().
Приложение не будет переносимым, если вы установите системный ключ.
Эта функция была добавлена в Qt 4.8.
См. также nativeKey(), key() и isAttached().
int QSharedMemory::size() const
Возвращает размер прикреплённого сегмента общей памяти. Если сегмент общей памяти не прикреплён, возвращается 0.
Примечание: Размер сегмента может быть больше, чем запрошенный размер, переданный в create().
См. также create() и attach().
bool QSharedMemory::unlock()
Освобождает блокировку сегмента общей памяти и возвращает true, если блокировка в настоящее время удерживается этим процессом. Если сегмент не заблокирован или блокировка удерживается другим процессом, ничего не происходит, и возвращается false.
См. также lock().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qsharedmemory.html