デフォルトでノンブロッキング I/O を備えた Qt フレームワークを使用して、複数の Web ページ (オンライン ストア) をナビゲートし、これらのページでさまざまなアクションを実行するアプリケーションを開発しています。特定の Web ページを、このページをナビゲートするために使用するステート マシンに "マッピング" しています。
このステート マシンには次の遷移があります。
Connect, LogIn, Query, LogOut, Disconnect
そしてこれらの州。
Start, Connecting, Connected, LoggingIn, LoggedIn, Querying, QueryDone, LoggingOut, LoggedOut, Disconnecting, Disconnected
*ing 状態から *ed 状態への移行 ( Connecting->Connected
) は、LoadFinished
現在要求されている URL が読み込まれたときにネットワーク オブジェクトから受信した非同期ネットワーク イベントによるものです。*ed から *ing 状態 ( Connected->LoggingIn
) への遷移は、私が送信したイベントによるものです。
このマシンにいくつかのイベント (コマンド) を送信できるようにしたい (Connect、LogIn、Query("productA")、Query("productB")、LogOut、LogIn、Query("productC")、一度に処理してもらいます。マシンに送信したすべてのイベントの処理が完了するのを待つことをブロックしたくありません。問題は、ダウンロードされている URL についてマシンに通知する上記のネットワーク イベントとインターリーブする必要があることです。*ing から *ed への進行は、ネットワーク タイプのイベントを受信した後にのみ行われるため、インターリーブがないと、マシンはその状態を進める (およびイベントを処理する) ことができません。
どうすれば設計目標を達成できますか?
編集
- 私が使用しているステート マシンには独自のイベント ループがあり、イベントはキューに入れられないため、マシンがビジー状態のときにイベントが発生すると、マシンによって見逃される可能性があります。
- ネットワーク I/O イベントは、使用しているステート マシンにもイベント キューにも直接ポストされません。それらは私のコード (ハンドラー) に投稿され、私はそれらを処理する必要があります。希望通りに転送できますが、備考欄にご注意ください。1.
現在の設計を詳細に説明したこの質問に対する私の回答を見てください。問題は、このデザインを作成することで、このデザインを改善できるかどうか、またどのように改善できるかです。
- より堅牢
- よりシンプルに