C
Qul::Platform::MessageQueueInterface Class
class Qul::Platform::MessageQueueInterfaceQt Quick Ultralite にプラットフォーム固有のキューを提供するインターフェースクラス。詳細...
| Header: | #include <platform/messagequeue.h> |
| Since: | Qt Quick Ultralite (Platform) 1.9 |
パブリック関数
(since Qt Quick Ultralite (Platform) 1.9) virtual | ~MessageQueueInterface() |
(since Qt Quick Ultralite (Platform) 1.9) virtual uint32_t | capacity() const = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual void | clearOverrun() = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual bool | discardSupported() const = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual Qul::Platform::MessageQueueStatus | enqueueOrDiscard(const void *message) = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual Qul::Platform::MessageQueueStatus | enqueueOrDiscardFromInterrupt(const void *message) |
(since Qt Quick Ultralite (Platform) 1.9) virtual Qul::Platform::MessageQueueStatus | enqueueOrOverwrite(const void *message) = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual Qul::Platform::MessageQueueStatus | enqueueOrOverwriteFromInterrupt(const void *message) |
(since Qt Quick Ultralite (Platform) 1.9) virtual bool | isEmpty() const = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual bool | isEmptyFromInterrupt() const |
(since Qt Quick Ultralite (Platform) 1.9) virtual bool | isOverrun() const = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual bool | overwriteSupported() const = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual Qul::Platform::MessageQueueStatus | receive(void *message, int32_t timeout = 0) = 0 |
(since Qt Quick Ultralite (Platform) 1.9) virtual Qul::Platform::MessageQueueStatus | receiveFromInterrupt(void *message, int32_t timeout = 0) |
保護された関数
(since Qt Quick Ultralite (Platform) 1.9) | MessageQueueInterface() |
詳細説明
Qt Quick Ultraliteはこのインターフェイスを使ってEventQueues 用のキューを実装する。これは、Qt Quick Ultraliteが提供するデフォルトの実装よりも優先される、独自のキュー実装(またはOSが提供するもの)を持っている場合に便利です。
デフォルトでは、enqueueOrDiscardFromInterrupt()、enqueueOrOverwriteFromInterrupt()、receiveFromInterrupt() は、それぞれの割り込み禁止バージョンを呼び出している。基本的なキュー機能が割り込みセーフであるか、割り込みセーフを保証するための対策が講じられていない限り、これらはオーバーライドされなければならない。
破棄および/または上書きのサポートは、discardSupported() およびoverwriteSupported() 関数から真偽値を返すことで通知される。
注意: EventQueue が期待通りに機能するためには、これらの操作の 1 つまたは両方がサポートされていなければなりません。
例
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::MessageQueue およびQul::EventQueueも参照してください 。
メンバ関数ドキュメント
[protected, since Qt Quick Ultralite (Platform) 1.9] MessageQueueInterface::MessageQueueInterface()
MessageQueueInterface を構築します。
この関数はQt Quick Ultralite (Platform) 1.9 で導入されました。
~MessageQueueInterface()も参照してください 。
[virtual noexcept, 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()も参照のこと 。
[virtual, since Qt Quick Ultralite (Platform) 1.9] Qul::Platform::MessageQueueStatus MessageQueueInterface::enqueueOrDiscardFromInterrupt(const void *message)
message をキューに追加するか、キューが一杯の場合はそれを破棄する。これはenqueueOrDiscard() と似ているが、割り込みセーフである。デフォルトの実装では、message でenqueueOrDiscard() を呼び出す。
関数呼び出しの結果を示すMessageQueueStatus を返す。
この関数は、Qt Quick Ultralite (Platform) 1.9で導入された。
enqueueOrDiscard()、discardSupported()、receive()、receiveFromInterrupt()、enqueueOrOverwriteFromInterrupt()も参照のこと 。
[pure virtual, since Qt Quick Ultralite (Platform) 1.9] Qul::Platform::MessageQueueStatus MessageQueueInterface::enqueueOrOverwrite(const void *message)
キューが一杯の場合、message を追加するか、キューの最後の項目を上書きする。関数呼び出しの結果を示すMessageQueueStatus を返します。
この関数はQt Quick Ultralite (Platform) 1.9 で導入されました。
enqueueOrOverwriteFromInterrupt()、overwriteSupported()、receive()、receiveFromInterrupt()、enqueueOrDiscard()も参照のこと 。
[virtual, since Qt Quick Ultralite (Platform) 1.9] Qul::Platform::MessageQueueStatus MessageQueueInterface::enqueueOrOverwriteFromInterrupt(const void *message)
キューが一杯の場合、message を追加するか、キューの最後の項目を上書きする。これはenqueueOrOverwrite() と似ているが、割り込みセーフである。デフォルトの実装では、message でenqueueOrOverwrite() を呼び出す。
関数呼び出しの結果を示すMessageQueueStatus を返す。
この関数は、Qt Quick Ultralite (Platform) 1.9で導入された。
enqueueOrOverwrite()、overwriteSupported()、receive()、receiveFromInterrupt()、enqueueOrDiscardFromInterrupt()も参照のこと 。
[pure virtual, since Qt Quick Ultralite (Platform) 1.9] bool MessageQueueInterface::isEmpty() const
キューが空であればtrue を、そうでなければfalse を返す。
この関数はQt Quick Ultralite (Platform) 1.9 で導入されました。
isEmptyFromInterrupt()も参照してください 。
[virtual, since Qt Quick Ultralite (Platform) 1.9] bool MessageQueueInterface::isEmptyFromInterrupt() const
キューが空であればtrue を、そうでなければfalse を返す。これはisEmpty() に似ているが、割り込みセーフである。
この関数はQt Quick Ultralite (Platform) 1.9で導入された。
isEmpty()も参照 。
[pure virtual, since Qt Quick Ultralite (Platform) 1.9] bool MessageQueueInterface::isOverrun() const
キューが破棄または上書きされたアイテムによってオーバーランされた場合にtrue を返します。
この関数はQt Quick Ultralite (Platform) 1.9 で導入されました。
clearOverrun()も参照してください 。
[pure virtual, since Qt Quick Ultralite (Platform) 1.9] bool MessageQueueInterface::overwriteSupported() const
上書きがサポートされている場合はtrue を返す。つまり、enqueueOrOverwrite() とenqueueOrOverwriteFromInterrupt() が使用できる。
この関数はQt Quick Ultralite (Platform) 1.9 で導入されました。
discardSupported()、enqueueOrOverwrite()、enqueueOrOverwriteFromInterrupt()も参照 。
[pure virtual, since Qt Quick Ultralite (Platform) 1.9] Qul::Platform::MessageQueueStatus MessageQueueInterface::receive(void *message, int32_t timeout = 0)
キューから最初のメッセージを返す。成功した場合、message はポップされたメッセージとMessageQueueStatus::Success を含んでいなければならない。失敗した場合、NULLポインタとともに、適切なエラーMessageQueueStatus が返されなければならない。timeout が指定された場合、関数はtimeout ミリ秒後に戻らなければならない。タイムアウト値がゼロの場合、関数はまったくブロックしないことを意味し、負の値の場合、関数は無限に待機することを意味する。
この関数はQt Quick Ultralite (Platform) 1.9で導入されました。
receiveFromInterrupt()、enqueueOrDiscard()、enqueueOrDiscardFromInterrupt()、enqueueOrOverwrite()、enqueueOrOverwriteFromInterrupt()も 参照のこと。
[virtual, since Qt Quick Ultralite (Platform) 1.9] Qul::Platform::MessageQueueStatus MessageQueueInterface::receiveFromInterrupt(void *message, int32_t timeout = 0)
キューから最初のメッセージを返す。これはreceive() と似ているが、割り込みセーフである。デフォルトの実装ではreceive() を呼び出す。message とtimeout の両方がreceive() のように使用されますが、割り込みからキューを処理するときには timeout を使用してはなりません。
この関数はQt Quick Ultralite (Platform) 1.9 で導入された。
receive(),enqueueOrDiscard(),enqueueOrDiscardFromInterrupt(),enqueueOrOverwrite(),enqueueOrOverwriteFromInterrupt()も参照してください 。
特定の Qt ライセンスの下で利用可能です。
詳細をご覧ください。