Класс QSharedMemory
Класс QSharedMemory предоставляет доступ к сегменту общей памяти. Подробнее...
| Заголовок: | #include <QSharedMemory> |
| qmake: | QT += core |
| С тех пор: | Qt 4.4 |
| Наследуется от: | QObject |
Этот класс был введён в Qt 4.4.
Типы общего доступа
| перечисление | AccessMode { ReadOnly, ReadWrite } |
| перечисление | SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, AlreadyExists, …, 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(). При использовании системных ключей общая память не защищена от множественного доступа к ней (например, не может быть заблокирована()), и для достижения такой защиты необходимо использовать пользовательскую механику.
Документация по типам членов
перечисление 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().
END_OF_DOCUMENT_MARKERСоздаёт объект общей памяти с заданным parent. Ключ объекта общей памяти не устанавливается конструктором, поэтому к объекту общей памяти не прикреплён сегмент общей памяти. Ключ необходимо установить с помощью setKey() или setNativeKey() перед использованием create() или attach().
См. также setKey().
[virtual] QSharedMemory::~QSharedMemory()
Деструктор очищает ключ, что заставляет объект общей памяти отсоединиться от его сегмента общей памяти. Если этот объект общей памяти является последним подключённым к сегменту общей памяти, операция отсоединения() уничтожает сегмент общей памяти.
См. также 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 преобразует этот ключ в системный ключ.
Если объект общей памяти подключен к сегменту общей памяти, он отсоединится от него перед установкой нового ключа. Эта функция не выполняет 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().
END_OF_DOCUMENT_MARKER
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qsharedmemory.html