Класс 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 = Q_NULLPTR) | |
| QSharedMemory(QObject *parent = Q_NULLPTR) | |
| ~QSharedMemory() | |
| bool | attach(AccessMode mode = ReadWrite) |
| const void * | constData() const |
| bool | create(int size, AccessMode mode = ReadWrite) |
| void * | data() |
| const void * | data() const |
| bool | detach() |
| 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() |
- 31 открытая функция унаследованная от QObject
Дополнительные унаследованные члены
- 1 свойство унаследованное от QObject
- 1 открытый слот, унаследованный от QObject
- 2 сигнала, унаследованные от QObject
- 11 статические открытые члены, унаследованные от 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 |
Попытка lock() сегмента общей памяти не удалась, потому что create() или attach() не удалось и вернули false, или из-за системной ошибки в QSystemSemaphore::acquire(). |
QSharedMemory::OutOfResources |
7 |
Операция create() не удалась, так как доступной памяти не хватило для заполнения запроса. |
QSharedMemory::UnknownError |
8 |
Произошла другая ошибка. |
Документация по функциям-членам
QSharedMemory::QSharedMemory(const QString &key, QObject *parent = Q_NULLPTR)
Создаёт объект общей памяти с заданным parent и ключом key. Поскольку ключ установлен, можно вызывать функции create() и attach().
См. также setKey(), create() и attach().
QSharedMemory::QSharedMemory(QObject *parent = Q_NULLPTR)
Эта функция перегружает QSharedMemory().
Создаёт объект общей памяти с заданным parent. Ключ объекта общей памяти конструктором не устанавливается, поэтому к сегменту общей памяти не прикреплён. Ключ необходимо установить с помощью setKey() или setNativeKey() перед использованием create() или attach().
См. также setKey().
QSharedMemory::~QSharedMemory()
Деструктор очищает ключ, что заставляет объект общей памяти отсоединиться от сегмента общей памяти. Если этот объект общей памяти является последним подключённым к сегменту общей памяти, операция detach() уничтожает сегмент общей памяти.
См. также detach() и isAttached().
bool QSharedMemory::attach(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, 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().
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, это означает, что вы проигнорировали ложное возвращение из 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().
END_OF_DOCUMENT_MARKERint QSharedMemory::size() const
Возвращает размер присоединённого сегмента общей памяти. Если сегмент общей памяти не присоединён, возвращается 0.
См. также 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/archives/qt-5.6/qsharedmemory.html