C
Qul::EventQueue Class
template <typename EventType_, Qul::EventQueueOverrunPolicy overrunPolicy, size_t queueSize> class Qul::EventQueueアプリケーションのさまざまな部分間でイベントを送受信するための便利な方法を提供します。詳細...
| Header: | #include <qul/eventqueue.h> |
| Since: | Qt Quick Ultralite 1.0 |
パブリック型
パブリック関数
| EventQueue() | |
| ~EventQueue() | |
(since Qt Quick Ultralite 2.3) void | clearOverrun() |
(since Qt Quick Ultralite 2.3) bool | isOverrun() const |
| virtual void | onEvent(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event) = 0 |
| virtual void | onEventDiscarded(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event) |
| virtual void | onQueueOverrun() |
| void | postEvent(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event) |
| void | postEventFromInterrupt(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event) |
詳細な説明
これは、event 、EventQueueOverrunPolicy 、およびキューの最大size の型を必要とするテンプレートクラスです。デフォルト値は、EventQueueOverrunPolicy_Discard 、キューサイズは5 です。詳細については、Adjusting the Queue Size を参照してください。
一般に、イベントは、割り込みコンテキスト外では `postEvent ` 関数を使用して、割り込みハンドラ内では `postEventFromInterrupt ` 関数を使用して、キューに投稿できます。イベントを処理するには `onEvent ` をオーバーライドします。通常、処理は次のフレーム内に行われます。
DoubleQueue は、ベアメタルプラットフォームにおけるデフォルトのキューバックエンドです。書き込みと読み取りが別々のリストに向けられるため、書き込みが1つだけである限り、割り込みセーフです。キューへの書き込みが1つだけの場合、postEventFromInterrupt() は割り込みから呼び出すことができます。 複数のライターが存在する場合、postEvent() またはpostEventFromInterrupt() が、同じキューに対する別のpostEvent() またはpostEventFromInterrupt() によって中断されないようにする必要があります。process() は、postEvent() またはpostEventFromInterrupt() による中断を受けても安全です。
std::thread および std::mutex をサポートする組み込みプラットフォームでは、ミューテックスを使用することで、キューはスレッドセーフになります。
RTOS ベースのプラットフォームの場合、キューバックエンドの実装は RTOS 固有のキューに基づいており、これによりQul::EventQueue はマルチスレッド環境でもスレッドセーフになります。
Qt Quick Ultralite が提供するデフォルトのバックエンドは、memcpy() またはそれに相当する関数を使用して、データをキューにコピーします。つまり、EventQueue で使用されるデータ型は、POD(Plain Old Data)であるか、POD を含むものでなければなりません。これが不可能な場合は、代わりにポインタを使用する必要があります。 ただし、Qt Quick Ultraliteが提供するバックエンドは、イベントがポインタである場合、メモリ管理を行いません。EventQueueOverrunPolicy_Discard およびonEventDiscarded を使用するか、上書きされるイベントのメモリ処理を行うカスタムバックエンドを提供する必要があります。詳細については、「カスタムキューの実装」を参照してください。
キューが保持可能な数以上のイベントを受信した場合、それらのイベントはEventQueueOverrunPolicy に従って処理されます。さらに、clearOverrun の呼び出しによって状態がリセットされていない限り、イベントの処理前にonQueueOverrun が呼び出されます。
EventQueueOverrunPolicy_Discard を使用しており、破棄されたイベントに対して追加の処理が必要な場合は、onEventDiscarded 関数をオーバーライドできます。
例
EventQueue を継承して特定のイベントタイプ用のキューを作成し、onEvent をオーバーライドします:
#include <qul/eventqueue.h>
typedef int IntegerEvent;
class IntegerEventQueue : public Qul::EventQueue<IntegerEvent> {
void onEvent(const IntegerEvent &event) override {
// do some stuff with your event here
}
};次に、キューのインスタンスを作成します。QML にデータやシグナルを公開するキューは、多くの場合 EventQueue に加えて Singleton から派生しているため、この手順は不要です。
IntegerEventQueue integerEventQueue;これで、割り込みコンテキストの外からイベントを投稿できるようになります:
integerEventQueue.postEvent(42);あるいは、割り込みハンドラから:
integerEventQueue.postEventFromInterrupt(42);キューサイズの調整
デフォルトでは、キューのサイズは `5` に設定されています。このサイズによって、連続するディスパッチ操作の間に保存できるイベントの数が決まります。ディスパッチは可能な限り速やかに、通常は次のアプリケーションフレーム内で行われます。キューが満杯になった際の挙動を制御するには、EventQueueOverrunPolicy を使用します。
// A queue where only the most recent event is interesting
Qul::EventQueue<IntegerEvent, Qul::EventQueueOverrunPolicy_OverwriteOldest, 1>
// A queue that can store many events
Qul::EventQueue<IntegerEvent, Qul::EventQueueOverrunPolicy_Discard, 1000>onQueueOverrun メソッドをオーバーライドすると、オーバーフローの通知を受け取ることができます。
class AudioQueue : public Qul::EventQueue<float, Qul::EventQueueOverrunPolicy_Discard, 1000>
{
void onQueueOverrun() override {
// Avoid the problem by reducing the frequency of event generation.
setSampleRate(8000);
clearOverrun();
}
};イベントの順序
各キュー内のイベントの順序は保持されますが、異なるキュー間の順序は保証されません。
これは、入力イベントなど、イベントの順序が重要な場合には問題となる可能性があります。
keyboardInput.postEvent(KeyEvents(...));
touchInput.postEvent(TouchEvent(...));
// Unknown whether the KeyEvent or TouchEvent is processed first!このような場合は、個別のキューではなく、union または std::variant イベント型を使用した単一のキューを使用してください。
「割り込みハンドラから QML へのデータ転送」も参照してください 。
メンバー関数のドキュメント
EventQueue::EventQueue()
キューを構築し、イベント処理のためにアプリケーションに登録します。
EventQueue::~EventQueue()
キューを破棄し、その登録を解除します。
[since Qt Quick Ultralite 2.3] void EventQueue::clearOverrun()
実装のオーバーランフラグをクリアします。
この関数は、Qt Quick Ultralite 2.3 で導入されました。
Qul::Platform::MessageQueueInterface::clearOverrun() およびisOverrun()も参照してください 。
[since Qt Quick Ultralite 2.3] bool EventQueue::isOverrun() const
実装のキューが、破棄されるか上書きされるイベントによってオーバーランした場合、true を返します。
この関数は、Qt Quick Ultralite 2.3 で導入されました。
Qul::Platform::MessageQueueInterface::isOverrun() およびclearOverrun()も参照してください 。
[pure virtual] void EventQueue::onEvent(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event)
派生クラスは、event を処理するために、このメソッドをオーバーライドする必要があります。
各キューでは、イベントは古いものから新しいものの順に処理されます。
[virtual] void EventQueue::onEventDiscarded(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event)
派生クラスは、破棄されるevent を処理するために、このメソッドをオーバーライドすることができます。これは、EventType_ 引数がポインタであり、適切な破棄ルーチンが必要な場合に役立ちます。
この関数は、Qul::EventQueueOverrunPolicy_Discard が使用されている場合にのみ呼び出されます。
[virtual] void EventQueue::onQueueOverrun()
派生クラスは、キューのオーバーランを処理するためにこのメソッドをオーバーライドすることができます。
この関数は、このキューに投稿されたイベントの数が、割り当てられたストレージ容量を上回った場合に呼び出されます。この関数は、postEvent またはpostEventFromInterrupt の呼び出し中に直ちに呼び出されるのではなく、次のonEvent のバッチ呼び出しの直前に呼び出されます。
void EventQueue::postEvent(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event)
event のコピーをキューに追加し、次のディスパッチ操作(通常は次のフレーム)中に処理されるようスケジュールします。
キューが満杯の場合、EventQueueOverrunPolicy は、そのイベントを破棄するか、古いイベントを上書きするかを決定します。いずれの場合も、onQueueOverrun の呼び出しがスケジュールされます。
注: 割り込みコンテキストからは 、代わりに `postEventFromInterrupt ` を使用してください。
void EventQueue::postEventFromInterrupt(const Qul::EventQueue<EventType_, overrunPolicy, queueSize>::EventType &event)
event のコピーをキューに追加し、次のディスパッチ操作(通常は次のフレーム)中に処理されるようスケジュールします。
キューが満杯の場合、EventQueueOverrunPolicy は、そのイベントを破棄するか、古いイベントを上書きするかを決定します。いずれの場合も、onQueueOverrun の呼び出しがスケジュールされます。
この関数は、割り込みコンテキストからイベントを投稿する際に使用する必要があります。
特定の Qt ライセンスの下で利用可能です。
詳細はこちらをご覧ください。