Класс QSharedMemory
Класс QSharedMemory предоставляет доступ к сегменту общей памяти. Подробнее...
| Заголовок: | #include <QSharedMemory> |
| qmake: | QT += core |
| С тех пор: | Qt 4.4 |
| Наследует: | QObject |
Типы
| Перечисление | AccessMode { ReadOnly, ReadWrite } |
| Перечисление | SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, ..., UnknownError } |
Общедоступные функции
| QSharedMemory(const QString &key, QObject *parent = nullptr) | |
| QSharedMemory(QObject *parent = nullptr) | |
| виртуальный | ~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() |
- 32 общедоступных функции, унаследованные от QObject
Статические общедоступные члены
| const QMetaObject | staticMetaObject |
- 10 статических общедоступных членов, унаследованных от QObject
Дополнительные унаследованные члены
- 1 свойство, унаследованное от QObject
- 1 общедоступный слот, унаследованный от QObject
- 2 сигнала, унаследованные от QObject
- 9 защищенных функций, унаследованных от QObject
Подробное описание
Класс 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()), и для достижения такой защиты необходимо использовать пользовательский механизм.
Документация по типам членов
Перечисление 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 |
Попытка заблокировать() сегмент общей памяти не удалась, потому что create() или attach() завершились неудачно и вернули false, или из-за системной ошибки в QSystemSemaphore::acquire(). |
QSharedMemory::OutOfResources |
7 |
Операция создания() не удалась из-за недостатка памяти для выполнения запроса. |
QSharedMemory::UnknownError |
8 |
Произошла другая ошибка. |
Документация функций-членов
QSharedMemory::QSharedMemory(const QString &ключ, QObject *родитель = nullptr)
Создаёт объект общей памяти с заданным родительским объектом и ключом ключ. Поскольку ключ задан, можно вызывать функции create() и attach().
См. также setKey(), create() и attach().
QSharedMemory::QSharedMemory(QObject *родитель = nullptr)
Эта функция перегружает QSharedMemory().
Создаёт объект общей памяти с заданным родительским объектом. Ключ объекта общей памяти не устанавливается конструктором, поэтому к объекту общей памяти не прикреплен сегмент общей памяти. Ключ необходимо задать с помощью setKey() или setNativeKey() перед использованием create() или attach().
См. также setKey().
[virtual] QSharedMemory::~QSharedMemory()
Деструктор очищает ключ, что заставляет объект общей памяти отсоединиться от его сегмента общей памяти. Если этот объект общей памяти является последним, подключенным к сегменту общей памяти, операция detach() уничтожает сегмент общей памяти.
См. также detach() и isAttached().
bool QSharedMemory::attach(QSharedMemory::AccessMode режим = ReadWrite)
Попытка подключить процесс к сегменту общей памяти, идентифицируемому ключом, переданным в конструктор или в вызов setKey() или setNativeKey(). Режим доступа по умолчанию — ReadWrite. Также может быть ReadOnly. Возвращает true, если операция подключения выполнена успешно. Если возвращается false, вызовите error(), чтобы определить, какая произошла ошибка. После подключения к сегменту общей памяти указатель на общую память можно получить, вызвав data().
См. также isAttached(), detach() и create().
const void *QSharedMemory::constData() const
Возвращает константный указатель на содержимое сегмента общей памяти, если он подключен. В противном случае возвращает null. Не забудьте заблокировать общую память с помощью lock() перед чтением или записью в общую память и не забудьте разблокировать её с помощью unlock() после завершения работы.
См. также attach() и create().
bool QSharedMemory::create(int размер, QSharedMemory::AccessMode режим = ReadWrite)
Создаёт сегмент общей памяти размером размер байт с ключом, переданным в конструктор, заданным с помощью setKey() или setNativeKey(), затем подключается к новому сегменту общей памяти с заданным режимом доступа режим и возвращает 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() для этой общей памяти, или 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(), вы получите ключ, специфичный для платформы, преобразованный ключ.
Если объект общей памяти присоединен к базовому сегменту общей памяти, он будет отсоединиться от него перед установкой нового ключа. Эта функция не выполняет присоединение.
См. также key(), nativeKey() и isAttached().
void QSharedMemory::setNativeKey(const QString &key)
Устанавливает системный, специфичный для платформы, ключ key для данного объекта общей памяти. Если key совпадает с текущим системным ключом, функция завершается без выполнения каких-либо действий. Если вам нужно только назначить ключ сегменту, вы должны вызвать setKey() вместо этого.
Вы можете вызвать nativeKey(), чтобы получить системный ключ. Если был назначен системный ключ, вызов key() вернёт пустую строку.
Приложение не будет портативным, если вы установите системный ключ.
Эта функция была введена в 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.12/qsharedmemory.html