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 ライセンスの下で利用可能です。
詳細をご覧ください。