PySide6.QtCore.QSharedMemory

class QSharedMemory

QSharedMemory 类提供了对共享内存段的访问。更多

PySide6.QtCore.QSharedMemory 的继承图

概要

方法

静态函数

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

QSharedMemory 提供了多个线程和进程对共享内存段的访问。共享内存段通过一个键来标识,该键由QNativeIpcKey表示。可以通过使用platformSafeKey()以跨平台的方式创建一个键。

一个 QSharedMemory 对象必须 create() 该段,并且此调用指定了段的大小。所有其他进程只需 attach() 到必须已经存在的段。在任一操作成功后,应用程序可以调用 data() 来获取指向数据的指针。

为了支持非原子操作,QSharedMemory 提供了获取独占访问的API:在读取或写入共享内存之前,您可以使用lock()锁定共享内存,但请记住在完成后使用unlock()释放锁。

默认情况下,当最后一个QSharedMemory实例从共享内存段detached并且没有对该段的引用时,QSharedMemory会自动销毁共享内存段。

有关键类型、平台特定限制以及与旧版或非Qt应用程序的互操作性的详细信息,请参阅Native IPC Keys文档。其中包括关于Apple平台上沙盒应用程序的重要信息,包括通过Apple App Store获得的所有应用程序。

class AccessMode

常量

描述

QSharedMemory.ReadOnly

共享内存段是只读的。不允许写入共享内存段。尝试写入使用ReadOnly创建的共享内存段会导致程序中止。

QSharedMemory.ReadWrite

允许读取和写入共享内存段。

class SharedMemoryError

常量

描述

QSharedMemory.NoError

没有发生错误。

QSharedMemory.PermissionDenied

操作失败,因为调用者没有所需的权限。

QSharedMemory.InvalidSize

创建操作失败,因为请求的大小无效。

QSharedMemory.KeyError

操作失败,因为使用了无效的键。

QSharedMemory.AlreadyExists

一个 create() 操作失败,因为具有指定键的共享内存段已经存在。

QSharedMemory.NotFound

由于找不到具有指定键的共享内存段,attach() 失败。

QSharedMemory.LockError

尝试lock()共享内存段失败,因为create()attach()失败并返回false,或者因为在acquire()中发生了系统错误。

QSharedMemory.OutOfResources

create() 操作失败,因为没有足够的内存来满足请求。

QSharedMemory.UnknownError

发生了其他不好的事情。

__init__([parent=None])
Parameters:

父对象QObject

此函数重载了 QSharedMemory()

使用给定的parent构造一个共享内存对象。共享内存对象的键不是由构造函数设置的,因此共享内存对象没有附加的底层共享内存段。在使用create()attach()之前,必须使用setNativeKey()设置键。

另请参阅

setNativeKey()

__init__(key[, parent=None])
Parameters:

这是一个重载函数。

使用给定的parent构造一个共享内存对象,并将其键设置为key。因为其键已设置,所以可以调用其create()attach()函数。

__init__(key[, parent=None])
Parameters:

使用给定的parent构造一个共享内存对象,并将遗留键设置为key。因为其键已设置,所以可以调用其create()attach()函数。

另请参阅

setKey() create() attach()

attach([mode=QSharedMemory.AccessMode.ReadWrite])
Parameters:

modeAccessMode

Return type:

布尔

尝试将进程附加到由传递给构造函数的键或调用setNativeKey()标识的共享内存段。访问mode默认为ReadWrite。也可以是ReadOnly。如果附加操作成功,则返回true。如果返回false,则调用error()以确定发生了哪个错误。附加共享内存段后,可以通过调用data()获取指向共享内存的指针。

constData()
Return type:

void

返回一个指向共享内存段内容的常量指针,如果已附加。否则返回null。此函数返回的值在发生detach之前不会改变,因此存储此指针是安全的。

如果内存操作不是原子的,你可以在读取或写入之前使用lock()锁定共享内存,但记得在完成后使用unlock()释放锁。

另请参阅

attach() create()

create(size[, mode=QSharedMemory.AccessMode.ReadWrite])
Parameters:
Return type:

布尔

创建一个大小为size字节的共享内存段,使用传递给构造函数的键或通过setNativeKey()设置的键,然后以给定的访问mode附加到新的共享内存段并返回true。如果由键标识的共享内存段已经存在,则不执行附加操作并返回false。当返回值为false时,调用error()以确定发生了哪个错误。

另请参阅

error()

detach()
Return type:

布尔

将进程从共享内存段中分离。如果这是附加到共享内存段的最后一个进程,则系统将释放共享内存段,即内容被销毁。如果函数成功分离共享内存段,则返回true。如果返回false,通常意味着该段未附加,或者被另一个进程锁定。

另请参阅

attach() isAttached()

error()
Return type:

SharedMemoryError

返回一个值,指示是否发生了错误,如果是,则指示是哪个错误。

另请参阅

errorString()

errorString()
Return type:

字符串

返回最后一次发生的错误的文本描述。如果error()返回一个error value,调用此函数以获取描述错误的文本字符串。

另请参阅

error()

isAttached()
Return type:

布尔

如果此进程附加到共享内存段,则返回 true

另请参阅

attach() detach()

static isKeyTypeSupported(type)
Parameters:

类型Type

Return type:

布尔

key()
Return type:

字符串

返回与此共享内存关联的由setKey()分配的旧键,如果未分配键或段正在使用nativeKey(),则返回空键。该键是Qt应用程序用于标识共享内存段的标识符。

你可以通过调用nativeKey()来找到操作系统使用的原生、平台特定的键。

另请参阅

setKey() setNativeKey()

static legacyNativeKey(key[, type=QNativeIpcKey.legacyDefaultTypeForOs()])
Parameters:
Return type:

QNativeIpcKey

lock()
Return type:

布尔

这是一个信号量,用于锁定共享内存段以供此进程访问,并返回true。如果另一个进程已经锁定了该段,此函数将阻塞,直到锁被释放。然后它获取锁并返回true。如果此函数返回false,这意味着您忽略了来自create()attach()的false返回,或者您使用setNativeKey()设置了密钥,或者acquire()由于未知的系统错误而失败。

另请参阅

unlock() data() acquire()

nativeIpcKey()
Return type:

QNativeIpcKey

返回此共享内存对象的键类型。键类型与nativeKey()一起作为操作系统用于标识共享内存段的标识符。

您可以使用原生键访问未由Qt创建的共享内存段,或授予非Qt应用程序共享内存访问权限。有关更多信息,请参见Native IPC Keys

nativeKey()
Return type:

字符串

返回此共享内存对象的本地、平台特定的键。本地键是操作系统用于标识共享内存段的标识符。

您可以使用原生键来访问不是由Qt创建的共享内存段,或者授予非Qt应用程序共享内存访问权限。有关更多信息,请参见Native IPC Keys

static platformSafeKey(key[, type=QNativeIpcKey.DefaultTypeForOs])
Parameters:
Return type:

QNativeIpcKey

setKey(key)
Parameters:

key – str

这是一个重载函数。

设置此共享内存对象的旧版key。如果key与当前键相同,则函数不执行任何操作直接返回。否则,如果共享内存对象已附加到底层共享内存段,则在设置新键之前,它将detach。此函数不执行attach()

你可以调用key()来获取旧的密钥。这个函数与以下内容基本相同:

shm.setNativeKey(QSharedMemory::legacyNativeKey(key));

除了它允许使用key()获取遗留密钥。

setNativeKey(key)
Parameters:

keyQNativeIpcKey

设置此共享内存对象的原生、平台特定的key。如果key与当前的原生键相同,函数将不执行任何操作直接返回。否则,如果共享内存对象已附加到底层共享内存段,它将在设置新键之前detach。此函数不会执行attach()

如果本机密钥是从另一个进程共享的,此函数非常有用。有关更多信息,请参见Native IPC Keys

可以使用platformSafeKey()获取便携式本地密钥。

你可以调用nativeKey()来获取原生密钥。

setNativeKey(key[, type=QNativeIpcKey.legacyDefaultTypeForOs()])
Parameters:

设置此共享内存对象的原生、平台特定的key,类型为type(自Qt 6.6起可用type参数)。如果key与当前的原生key相同,函数将不执行任何操作直接返回。否则,如果共享内存对象已附加到底层共享内存段,它将在设置新key之前detach。此函数不会执行attach()

如果原生密钥是从另一个进程共享的,这个函数很有用,尽管应用程序必须注意确保密钥类型与另一个进程期望的类型匹配。有关更多信息,请参见Native IPC Keys

可以使用platformSafeKey()获取便携式本地密钥。

你可以调用nativeKey()来获取原生密钥。

size()
Return type:

整数

返回附加的共享内存段的大小。如果没有附加共享内存段,则返回0。

注意

段的大小可能大于传递给create()的请求大小。

另请参阅

create() attach()

unlock()
Return type:

布尔

如果当前进程持有共享内存段的锁,则释放该锁并返回true。如果该段未被锁定,或者锁由另一个进程持有,则不执行任何操作并返回false。

另请参阅

lock()