Класс QSharedMemory

Перевод: Лев Алексеевский

12 октября 2011

Модуль QtCore

Класс QSharedMemory предоставляет доступ к сегменту разделяемой памяти.

#include <QSharedMemory>

Унаследован от QObject.

Этот класс введён в версии Qt 4.4.

Public Types Public Functions

Подробное описание

Класс QSharedMemory предоставляет доступ к сегменту разделяемой памяти из разных потоков и процессов. Он также предоставляет возможность отдельному потоку или процессу заблокировать память, получая эксклюзивный доступ.

При использовании этого класса помните о следующих пратформенных различиях:

Windows: QSharedMemory не "владеет" сегментом разделяемой памяти. Если все потоки или процессы, имеющие экземпляры QSharedMemory связанные с определённым сегментом разделяемой памяти, уничтожат свой экземпляр QSharedMemory или завершатся, ядро Windows освободит сегмент разделяемой памяти автоматически.

Unix: QSharedMemory "владеет" сегментом разделяемой памяти. Когда последний поток или процесс, имеющий экземпляр QSharedMemory сопоставленный связанный с определённым сегментом разделяемой памяти отсоединится от этого сегмента уделением экземпляра QSharedMemory, ядро Unix освобождает сегмент. Однако если последний поток или процесс рухнет без вызова деструктора QSharedMemory, сегмент разделяемой памяти останется.

Не забывайте блокировать разделяемую память методом lock() перед чтением или записью в неё, и также не забывайте разблокировать её методом unlock() после того как вы закончите операции с ней.

В отличие от QtSharedMemory, QSharedMemory автоматически уничтожает сегмент разделяемой памяти как только последний экземпляр QSharedMemory будет отвязан от этого сегмента, и не останется не одной ссылки на него. Не совмещайте использование QtSharedMemory и QSharedMemory. Портируйте всё на QSharedMemory.

Предупреждение: QSharedMemory изменяет ключ памяти специфическим для QT способом, а потому на данный момент невозможно использовать разделяемую память приложений написанных не на Qt при помощи QsharedMemory.

Типы класса

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 Операция create() провалилась, поскольку сегмент с заданным ключом уже существует
QSharedMemory::NotFound 5 Операция attach() провалилась, поскольку не удалось найти сегмент с заданным ключом
QSharedMemory::LockError 6 Попытка блокировать lock() сегмент разделяемой памяти провалилась, поскольку create() или attach() провалились и вернули false, или потому что возникла системная ошибка в QSystemSemaphore::aquire().
QSharedMemory::OutOfResources 7 Операция create() провалилась, потому что недостаточно памяти для размещения
QSharedMemory::UnknownError 8 Случилось ещё что-то плохое

Функции класса

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

Создает объект разделяемой памяти с заданным родителем (parent) и установленным ключом (key). Поскольку ключ объекта задан, можно вызывать функции create() и attach().

См. также методы setKey() , create() и attach().

QSharedMemory::QSharedMemory (QObject * parent = 0)

Это перегруженная функция QSharedMemory().

Функция создаёт объект разделяемой памяти с заданным родителем (parent). Ключ объекта разделяемой памяти не задаётся в конструкторе, потому объект не имеет связанного сегмента разделяемой памяти. Прежде чем вызывать функции create() и attach(), необходимо установить ключ методом setKey().

См. также setKey().

QSharedMemory::~QSharedMemory ()

Деструктор отчищает ключ, что приводит к отвязыванию (detach) объекта от соответствующего сегмента памяти. Если этот объект являлся последним привязанным к сегменту, операция detach() уничтожит сегмент.

См. также detach() и isAtached().

bool QSharedMemory::attach (AccessMode mode = ReadWrite)

Пытается связать процесс с сегментом разделяемой памяти, определяемый ключом, заданным в конструкторе или при вызове функции setKey(). Режим доступа по умолчанию ReadOnly. Возвращает true, если операция связывания прошла успешно. Если функция возвращает false, вызовите error() для того, чтобы определить, какая именно ошибка произошла. После связывания сегмента разделяемой памяти получить указатель на разделяемую память можно вызвав функцию data().

См. также isAttached() , detach() и create().

const void * QSharedMemory::constData () const

Возвращает const pointer указатель на содержимое сегмента разделяемой памяти, если он сопоставлен. В противном случае функция возвращает false. Не забывайте заблокировать разделяемую память посредством lock() прежде чем читать или записывать в разделяемую память, и разблокировать её через unlock() после проведения операций.

см. также attach() и create() .

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

Создает сегмент разделяемой памяти с размером в байтах size и ключом, указанным в конструкторе или через метод setSize(), связывает объект с этим сегментом с заданным режимом доступа и возвращает 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().

bool QSharedMemory::lock()

Это семафор, который блокирует сегмент разделяемой памяти для предоставления доступа данному процессу и возвращает true. Если другой процесс заблокировал данный сегмент, функция приостанавливается до того момента, пока блокировка не будет снята. После этого процесс сам осуществляет блокировку и возвращает true. Если функция возвращает false, это означает, что вы проигнорировали возвращение false функциями create() или attach(), или что при выполнении QSystemSemaphore::acquire() произошла неизвестная системная ошибка.

См. также unlock() , data() , и QSystemSemaphore::acquire().

SharedMemoryError QSharedMemory::error () const

Возвращает значение, говорящее о том, произошла ли ошибка и, если произошла, то какая именно.

См. также errorString() .

QString QSharedMemory::errorString () const

Возвращает текстовое описание последней ошибки, которая произошла. Если функция error() возвращает код ошибки, можно вызвать эту функцию, чтобы получить текстовую строчку с её описанием.

См. также error() .

bool QSharedMemory::isAttached() const

Возвращает true, если процесс связан с сегментом разделяемой памяти.

См. также attach() и detach() .

QString QSharedMemory::key() const

Возвращает ключ назначенный данному сегменту разделяемой памяти и используется системой для идентификации сегмента разделяемой памяти. Когда QSharedMemory используется для связи между процессами, посредством ключа осуществляется связывание отдельных процессов с одним сегментом разделяемой памяти.

См. также setKey().

void QSharedMemory::setKey (const QString & key)

Устанавливает новый ключ для данного объекта разделяемой памяти. Если задаваемый и текущий ключ одинаковы, функция не выполнит никаких действий. Если объект разделяемой памяти привязан к какому-то сегменту разделяемой памяти, он будет от него отвязан, прежде чем будет установлен новый ключ. Эта функция не вызывает attach().

См. также key() и isAttached().

int QSharedMemory::size () const

Возвращает размер связанного с объектом сегмента разделяемой памяти. Если объект не связан с каким-либо сегментом, функция возвращает 0.

См. также QSharedMemory и attach().

bool QSharedMemory::unlock()

Снимает блокировку сегмента разделяемой памяти и возвращает true, если она была установлена этим же процессом. Если сегмент незаблокирован или заблокирован каким-то другим процессом, ничего не произойдёт, и функция вернёт false.

См. также lock().

Источник: Qt.Nokia.com
Назад
Яндекс цитирования

Valid XHTML 1.0 Transitional

Правильный CSS!