イベントループの機能を提供するC ++ライブラリイベント駆動型アプリケーションの瞬時およびスケジュールされたイベントを処理する
イベントループはイベントを処理して、登録レシーバーにオプションでデータで通知します
イベントループを使用して、イベント処理のための現在のスレッドをブロックするか、独立したスレッドとして、現在のスレッドを他のタスクに無料で残すことができます
注:このライブラリは、IPC機能なしで同じプロセス内でマルチスレッドイベントプロセスのフレームワークを提供します
EventLoop::Mode::BLOCKイベントループのこのモードはEventLoop::Run()呼び出しが発行された現在のスレッド(通常メインスレッド)をブロックします
現在のスレッドは、ループが実行されている限り、イベントの処理を継続します
EventLoop::Mode::NON_BLOCKこのモードは、イベントループを別のスレッドで実行しますEventLoop::Run()
これは、同じスレッドでイベントループを起動した後、または独自のブロッキングイベントループを既に使用している場合、現在のスレッドが何らかの実行に到達する必要がある場合に有用であることが証明できます。後者の例は、メインスレッドをブロックして処理イベントを開始するQTフレームワークのQGuiApplication::exec()コールです。
それは重要な質問を提起します: QTのexec()のような主要なイベントループがすでに存在しているのに、なぜ二次イベントループが必要だったのですか?
私はあなたのことは知りませんが、QTのイベントループのいくつかの機能をひどく見逃しました。登録/購読しているすべてのレシーバーに信号をブロードキャストする機能などです。これは、イベントループライブラリをゼロから開発するための主要な動機でした。他の人たちは、物事がどのように機能するかについての飽くことのない好奇心や、ドッグフーディングのかゆみです。
放送は、各レシーバーを送信者の説明と接続することなく、アプリケーションの複数のコンポーネントに単一の刺激に基づいて行動する場合に典型的です。送信者インスタンスを複数の受信者に伝え、それぞれの信号スロット接続を作成して、QTでブロードキャストレセプションを可能にしてください!
もう1つの確かな理由は、イベントを登録およびトリガーするために、イベントプロバイダーまたは関連する送信者および受信機オブジェクトへの参照なしに、アプリケーション全体のグローバルイベント処理システムを作成することでした。 EventLoop 、発達者がCODEのどこでも、QTとは異なり、デベロッパーがCODEのどこにでもAPIコールを絶対に任意のスレッドから発行できるようにするスタンドアロンの静的クラスです。
ユーザーとして、イベントループライブラリをアプリケーションに動的にリンクし、アプリケーションコードにEventLoop.hヘッダーを含めてライブラリメソッドにアクセスできます。 Eventカスタムタイプとして使用して、名前とデータを含むイベントを配信および受信しているため、 Event.hヘッダーがソースファイルに必要です。
注:アプリケーションでライブラリを使用する場合、上記のものとは別に、このプロジェクトのディレクトリを含む他のヘッダーを含めないでください。覚えておくべき別の方法は、アプリに
.hヘッダーファイルのみが必要であり、すべての.hppファイルが無視できるということです。
詳細なAPIドキュメントは、 EventLoop.hヘッダーにあります。次の手順は、アプリケーションでのイベントループの使用の可能性を示しています。
main()関数では、ループを非ブロッキングしたい場合は、 EventLoop::SetMode()メソッドを呼び出します。これがデフォルトモードであるため、ブロッキングモードのためにこれを明示的に呼び出す必要はありませんmain()でEventLoop::Run()メソッドを呼び出しますEventLoop::RegisterEvent()を使用して、任意のクラスまたはソースファイルでEvent*を受け入れるコールバックを登録します。通常、登録はクラスコンストラクターで行われ、ラムダスまたはクラスメンバー機能がハンドラーとして行われますEventLoop::TriggerEvent()を使用して、アプリケーションの任意のスレッドでいつでもイベントをトリガーし、特定のイベント名に登録した対応するハンドラーは、使用する過負荷のタイプに応じて、瞬時にまたはタイムアウト後に呼び出されますEventタイプのEvent::getName()およびEvent::getData()メソッドEventLoop::Halt()メソッドの明示的な呼び出しを介して優雅に終了できるようにします。この方法は、いずれかのモードの任意のスレッドから呼び出すことができます。登録済みのハンドラー内で呼び出された場合、ハンドラースコープの完了時にのみ有効になりますヒント: QTの
exec()イベントループの上にEventLoopを使用する場合は、exec()callloopEventLoop::Run()EventLoop::Halt()を設定して、QGuiApplication::aboutToQuit
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
注:
EventLoop::Run()EventLoop::Run()call in callは実行されません。
ショッピングカートアプリは、このライブラリとAPIの使用基準として機能します。質問や説明がある場合は、[email protected]で私に連絡することができます
Releasesの下でライブラリの最新の安定したリリースを確認しますが、現在のソースコードバージョンを使用してソースからライブラリを構築する場合は、 build.shスクリプトを実行します。
スクリプトは、オプションなしで実行できます。各オプションのデフォルトは、使用命令の{}に表示されます。次のコマンドを実行して、スクリプトの使用について学ぶ
./build.sh -h
例として、 Unix Makefiles CMakeジェネレーターを使用してスクリプトを使用してリリースモードをビルドする場合、スクリプトは次のように実行できます
./build.sh -a -r -g "Unix Makefiles"
ビルドアーティファクトは、 buildディレクトリで生成されます
出力アーティファクトは、 libEventLoop.soとしてlibディレクトリに存在します。
あなたが思うなら、あなたはプロジェクトに貢献することを歓迎します
潜在的な貢献者として、できることはありません
質問や提案がある場合は、お気軽にご連絡ください[email protected]