C
Qul::EventQueue Class
template <typename EventType_, Qul::EventQueueOverrunPolicy overrunPolicy = EventQueueOverrunPolicy_Discard, size_t queueSize = 5> 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つである限り割り込みセーフです。postEventFromInterrupt()は、キューへの書き込みが1つの場合に割り込みから呼び出すことができる。複数のライタが存在する場合、postEvent()またはpostEventFromInterrupt()が、同じキューに対する別のpostEvent()またはpostEventFromInterrupt()によって割り込まれないようにしなければならない。process()は、postEvent()またはpostEventFromInterrupt()によって割り込まれても安全である。
std::threadとstd::mutexをサポートする組み込みプラットフォームでは、キューはmutexを使用することでスレッドセーフになります。
RTOS ベースのプラットフォームでは、キューのバックエンドの実装は RTOS 固有のキューに基づいており、これによりQul::EventQueue はマルチスレッド環境でスレッドセーフになります。
Qt Quick Ultraliteが提供するデフォルトのバックエンドは、memcpy() または同等のものを使用してデータをキューにコピーする。これは、EventQueue で使用されるデータ型が、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 ライセンスの下で利用可能です。
詳細はこちら。