C

MessageQueueInterface 类

Qul::Platform::MessageQueueInterface

提供特定平台队列的接口类,供 Qt Quick Ultralite 使用。 更多...

头文件 #include <platform/messagequeue.h>
Qt Quick Ultralite (Platform) 1.9

公共函数

虚拟~MessageQueueInterface()
虚拟 uint32_tcapacity() const = 0
虚拟 voidclearOverrun() = 0
虚拟 booldiscardSupported() const = 0
虚拟 Qul::Platform::MessageQueueStatusenqueueOrDiscard(const void *message) = 0
虚拟 Qul::Platform::MessageQueueStatusenqueueOrDiscardFromInterrupt(const void *message)
虚拟 Qul::Platform::MessageQueueStatusenqueueOrOverwrite(const void *message) = 0
虚拟 Qul::Platform::MessageQueueStatusenqueueOrOverwriteFromInterrupt(const void *message)
虚拟 boolisEmpty() const = 0
虚拟 boolisEmptyFromInterrupt() const
虚拟 boolisOverrun() const = 0
虚拟 booloverwriteSupported() const = 0
虚拟 Qul::Platform::MessageQueueStatusreceive(void *message, int32_t timeout = 0) = 0
虚拟 Qul::Platform::MessageQueueStatusreceiveFromInterrupt(void *message, int32_t timeout = 0)

受保护函数

详细描述

Qt Quick Ultralite 使用此接口实现 EventQueues 的队列。在有自己实现的队列(或操作系统提供的)时非常有用,并优于 Qt Quick Ultralite 提供的默认实现。

默认情况下,enqueueOrDiscardFromInterrupt()、enqueueOrOverwriteFromInterrupt() 和 receiveFromInterrupt() 会调用它们各自的非中断版本。除非底层队列功能是中断安全的或采取了确保中断安全的措施,否则这些函数必须被重写。*

通过从 discardSupported() 和 overwriteSupported() 函数返回布尔值来表示对丢弃和/或覆盖的支持。

注意:必须支持其中一个或两个操作,以确保事件队列能够按预期工作。

示例

MessageQueueInterface 是使用一个简单的环形缓冲区实现的。

队列实现不支持覆盖,因此所有无法推入队列的消息都会被丢弃。

子类可能看起来像这样

class MyMessageQueue : public MessageQueueInterface
{
public:
    MyMessageQueue(const uint32_t &capacity, const uint32_t &messageSize)
        : MessageQueueInterface()
        , mQueue(NULL)
        , mOverrunFlag(false)
    {
        void *memory = qul_malloc(sizeof(Private::CircularBuffer));
        mQueue = new (memory) Private::CircularBuffer(capacity, messageSize);
    }

    ~MyMessageQueue()
    {
        mQueue->~CircularBuffer();
        qul_free(mQueue);
    }

    MessageQueueStatus enqueueOrDiscard(const void *message) QUL_DECL_OVERRIDE
    {
        if (mQueue->isFull()) {
            // Discard message
            mOverrunFlag = true;
            return MessageQueueStatus::MessageDiscarded;
        }

        mQueue->pushBack(message);
        return MessageQueueStatus::Success;
    }

    MessageQueueStatus enqueueOrDiscardFromInterrupt(const void *message) QUL_DECL_OVERRIDE
    {
        // disableInterrupts();
        MessageQueueStatus state = enqueueOrDiscard(message);
        // enableInterrupts();
        return state;
    }

    MessageQueueStatus enqueueOrOverwrite(const void *message) QUL_DECL_OVERRIDE
    {
        return MessageQueueStatus::OverwriteNotSupported;
    }

    MessageQueueStatus receive(void *message, int32_t timeout = 0) QUL_DECL_OVERRIDE
    {
        (void) timeout; // This example does not implement timeout handling.

        if (mQueue->isEmpty())
            return MessageQueueStatus::EmptyQueue;

        mQueue->popFront(message);
        return MessageQueueStatus::Success;
    }

    MessageQueueStatus receiveFromInterrupt(void *message, int32_t timeout = 0) QUL_DECL_OVERRIDE
    {
        (void) timeout; // This example does not implement timeout handling.

        // disableInterrupts();
        MessageQueueStatus state = receive(message);
        // enableInterrupts();
        return state;
    }

    bool discardSupported() const QUL_DECL_OVERRIDE { return true; }
    bool overwriteSupported() const QUL_DECL_OVERRIDE { return false; }

    bool isEmpty() const QUL_DECL_OVERRIDE { return mQueue->isEmpty(); }
    bool isEmptyFromInterrupt() const QUL_DECL_OVERRIDE
    {
        // disableInterrupts();
        return isEmpty();
        // enableInterrupts();
    }

    bool isOverrun() const QUL_DECL_OVERRIDE { return mOverrunFlag; }

    void clearOverrun() QUL_DECL_OVERRIDE { mOverrunFlag = false; }

    uint32_t capacity() const QUL_DECL_OVERRIDE { return mQueue->capacity(); }

private:
    Private::CircularBuffer *mQueue;
    bool mOverrunFlag;
};

之后,实现 Qul::Platform::requestQueue() 函数

MessageQueueInterface *requestQueue(size_t queueCapacity, size_t messageSize)
{
    void *queue = qul_malloc(sizeof(MyMessageQueue));

    if (queue == NULL) {
        return NULL;
    }

    MessageQueueInterface *interface = new (queue) MyMessageQueue(queueCapacity, messageSize);
    return interface;
}

此外,实现 Qul::Platform::deleteQueue() 函数

void deleteQueue(MessageQueueInterface *queue)
{
    MyMessageQueue *mq = static_cast<MyMessageQueue *>(queue);
    mq->~MyMessageQueue();
    qul_free(mq);
}

最后,实现 Qul::Platform::maxQueueMessageSize()

size_t maximumQueueMessageSize()
{
    return LONG_MAX;
}

另请参阅:Qul::Platform::MessageQueueQul::EventQueue.

成员函数文档

[protected, since Qt Quick Ultralite (Platform) 1.9] MessageQueueInterface::MessageQueueInterface()

构建 MessageQueueInterface。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅:~MessageQueueInterface().

[virtual, since Qt Quick Ultralite (Platform) 1.9] MessageQueueInterface::~MessageQueueInterface()

销毁 MessageQueueInterface 类实例。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅:MessageQueueInterface().

[pure virtual, since Qt Quick Ultralite (Platform) 1.9] uint32_t MessageQueueInterface::capacity() const

返回队列可以容纳的最大项目数。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

[pure virtual, since Qt Quick Ultralite (Platform) 1.9] void MessageQueueInterface::clearOverrun()

清除队列的溢出状态。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅:isOverrun().

[pure virtual, since Qt Quick Ultralite (Platform) 1.9] bool MessageQueueInterface::discardSupported() const

如果支持丢弃,则返回 true。这意味着可以使用 enqueueOrDiscard() 和 enqueueOrDiscardFromInterrupt()。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅:overwriteSupported()、enqueueOrDiscard() 和 enqueueOrDiscardFromInterrupt().

[pure virtual, since Qt Quick Ultralite (Platform) 1.9] Qul::Platform::MessageQueueStatus MessageQueueInterface::enqueueOrDiscard(const void *message)

message 添加到队列中,如果队列已满则丢弃它。返回 MessageQueueStatus 指示函数调用的结果。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 enqueueOrDiscardFromInterrupt(),discardSupported(),receive(),receiveFromInterrupt() 和 enqueueOrOverwrite

[自 Qt Quick Ultralite (Platform) 1.9 起为虚函数] Qul::Platform::MessageQueueStatus MessageQueueInterface::enqueueOrDiscardFromInterrupt(const void *message)

将消息 message 添加到队列或将它丢弃,如果队列已满。它与enqueueOrDiscard() 类似,但中断安全。默认实现调用 enqueueOrDiscard() 并传入 message

返回指定函数调用结果的 MessageQueueStatus

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 enqueueOrDiscarddiscardSupportedreceivereceiveFromInterruptenqueueOrOverwriteFromInterrupt

[自 Qt Quick Ultralite (Platform) 1.9 起为纯虚函数] Qul::Platform::MessageQueueStatus MessageQueueInterface::enqueueOrOverwrite(const void *message)

message 添加到队列,或者如果队列已满,则覆盖它是队列中的最后一个项。返回指示函数调用结果的 MessageQueueStatus

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 enqueueOrOverwriteFromInterruptoverwriteSupportedreceivereceiveFromInterruptenqueueOrDiscard

[自 Qt Quick Ultralite (Platform) 1.9 起为虚函数] Qul::Platform::MessageQueueStatus MessageQueueInterface::enqueueOrOverwriteFromInterrupt(const void *message)

message 添加到队列,或者如果队列已满,则覆盖它是队列中的最后一个项。它与 enqueueOrOverwrite 类似,但中断安全。默认实现调用 enqueueOrOverwrite() 并传入 message

返回指定函数调用结果的 MessageQueueStatus

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 enqueueOrOverwriteoverwriteSupportedreceivereceiveFromInterruptenqueueOrDiscardFromInterrupt

[自 Qt Quick Ultralite (Platform) 1.9 起为纯虚函数] bool MessageQueueInterface::isEmpty() const

如果队列为空则返回 true;否则返回 false

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 isEmptyFromInterrupt

[自 Qt Quick Ultralite (Platform) 1.9 起为虚函数] bool MessageQueueInterface::isEmptyFromInterrupt() const

如果队列为空则返回 true;否则返回 false。它与 isEmpty 类似,但中断安全。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 isEmpty

【自从 Qt Quick Ultralite (Platform) 1.9 起为纯虚函数】bool MessageQueueInterface::isOverrun() const

如果对列溢出(由于项目被丢弃或覆盖),则返回 true

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 clearOverrun

【自从 Qt Quick Ultralite (Platform) 1.9 起为纯虚函数】bool MessageQueueInterface::overwriteSupported() const

如果支持覆盖,则返回 true。这意味着可以使用 enqueueOrOverwrite() 和 enqueueOrOverwriteFromInterrupt()。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 discardSupportedenqueueOrOverwriteenqueueOrOverwriteFromInterrupt

【自 Qt Quick Ultralite (Platform) 1.9 起为虚函数】Qul::Platform::MessageQueueStatus MessageQueueInterface::receive(void *message, int32_t timeout = 0)

从队列中返回第一条消息。成功时,message 必须包含弹出的消息和 MessageQueueStatus::Success。失败时,将返回适当的错误 MessageQueueStatus 以及一个空指针。如果指定了 timeout,则函数必须在 timeout 毫秒后才返回。零超时值表示函数完全不阻塞,而负值表示函数无限期等待。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 receiveFromInterruptenqueueOrDiscardenqueueOrDiscardFromInterruptenqueueOrOverwriteenqueueOrOverwriteFromInterrupt

【虚函数,自 Qt Quick Ultralite (Platform) 1.9 起存在】Qul::Platform::MessageQueueStatus MessageQueueInterface::receiveFromInterrupt(void *message, int32_t timeout = 0)

返回队列中的第一条消息。它与 receive 类似,但是中断安全的。默认实现调用 receive。与 receive 类似,使用 messagetimeout,尽管在处理中断队列时不要使用超时。

此功能是在 Qt Quick Ultralite (Platform) 1.9 中引入的。

另请参阅 receiveenqueueOrDiscardenqueueOrDiscardFromInterruptenqueueOrOverwriteenqueueOrOverwriteFromInterrupt

可在某些 Qt 许可证下使用。
了解更多信息。