問題タブ [qstatemachine]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ノンブロッキング I/O に直面してステート マシンを設計する方法は?
デフォルトでノンブロッキング 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.
現在の設計を詳細に説明したこの質問に対する私の回答を見てください。問題は、このデザインを作成することで、このデザインを改善できるかどうか、またどのように改善できるかです。
- より堅牢
- よりシンプルに
qt - QStateMachine が既に開始されている場合、状態、遷移、プロパティを追加できますか?
状態がプロパティを設定していないという問題があります。おそらく問題は、マシンの起動後にプロパティを追加し、現在の状態に追加しているためです。ただし、マシンが既に実行されている場合は、プロパティ、状態、遷移を追加する必要があります。ありがとうございました。
c++ - この Qt ステート マシンを機能させるにはどうすればよいですか?
チェックできる 2 つのウィジェットと、ゼロより大きい値を含む数値入力フィールドがあります。両方のウィジェットがチェックされ、数値入力フィールドにゼロより大きい値が含まれている場合は常に、ボタンを有効にする必要があります。この状況に適したステート マシンを定義するのに苦労しています。これまでのところ、次のものがあります。
ここでの問題は、次の遷移です。
ステート内のすべての子ステートをregisterButtonDisabled
初期ステートに戻します。a
状態とb
状態を同じ状態のままにしたいので、これは望ましくない動作です。
どうすればそれを保証し、同じ状態a
を維持できますか? b
ステートマシンを使用してこの問題を解決できる別の/より良い方法はありますか?
注. この問題を解決するには、無数の (おそらくより良い) 方法があります。ただし、ステート マシンを使用するソリューションにのみ関心があります。このような単純なユースケースは、単純なステートマシンを使用して解決できるはずだと思いますよね?
qt - QStatemachine と並列状態
ParallelState を使用した QStateMachine に夢中です。最初の状態、並列状態のグループを含む 2 番目の状態、および再び順次の別の状態を含むメイン状態 (順次) があります。最初の状態は N 個の入力ファイルを作成するプロセスを表し、2 番目の状態は各入力に対して動作する N 個のスレッド (1 つのファイルに対して 1 つのスレッド) を表し、最後の状態はプロセス全体のレポートを生成するプロセスを表します (その秒を待つ必要があります)。状態は完全に終了しています)。問題は、2 番目の状態と 3 番目の状態の間にバリアを作成する必要がある場合です。すべてのスレッドを完了するにはバリアが必要ですが、それができません。ドキュメントに従って、並列である複合状態は、そのすべての子が最終状態に入ったときに終了したと言われています。まず、この場合、最終状態に入るということは何を意味するのでしょうか。パラレル ステート内の各ステートに対して最終ステートを作成する必要がありますか? とにかく私はこれを試しますが、何もしません。その結果、最初のスレッドが終了すると、コンテナーの最終状態が呼び出されます。
これはスニペットです:
2 番目の状態が完全に終了するのを待つにはどうすればよいでしょうか。また、各 pState の終了シグナルで QObject::connect を使用しようとしましたが、呼び出されません。
ありがとう、最高
qt - QStateMachine に投稿された QEvent の無視/拒否を検出するにはどうすればよいですか
ステート マシンに投稿されたカスタム イベントが受け入れられたかどうかを確認する必要があります。私のアプローチは、QStateMachine をサブクラス化することです。http://doc.qt.nokia.com/latest/statemachine-api.htmlセクションのイベント、遷移、およびガードを参照してください。
以下のコードで見逃したものはないのではないかと思っています。別の/より良いアプローチはありませんか?
基本的には、Qt Doc と同じです。
そして、拒否を検出するために私が見つけることができる最も簡単な方法はこれです:
c++ - C ++ Qt:QStateMachineの現在の状態を確認してください
Qt(C ++)でステートマシンを実装しようとしています。QStateMachineの現在の状態を確認するにはどうすればよいですか?ドキュメントにメソッドが見つかりませんでした。
どうも
c++ - QStateMachineを使用したメニュー画面間の移行
を使用して、ゲーム内のメニュー画面間を移行することを検討していQStateMachine
ます。ただし、状態間の遷移が発生したときに、一部のコード(たとえばshow()
、 )を開始する方法がわかりません。QWidget
昔ながらの信号(コメントアウトされたコードを参照)を使用すると非常に簡単に実行できますが、トランジションを使用して画面を切り替えると、おそらくいくつかの凝ったアニメーションを実行できると思います。
これが私のコードです:
編集:Koyingの提案に従って更新されました。
ApplicationWindow.h:
ApplicationWindow.cpp:
LoadGameMenu.h:
LoadGameMenu.cpp:
MainMenu.h:
MainMenu.cpp:
main.cpp:
では、遷移が発生したときに、どのように動作またはアクションをトリガーするのですか?
乾杯。
c++ - Qt QStateMachine同期の問題:開始信号に初期状態が設定されていません
だから私はQtのQStateMachineの問題を理解しようとしています。そして、誰かがこれが起こっている理由を説明するのを手伝ってくれることを望んでいます。修正だけでなく、QStateMachineの基本的な理解に非常に興味があります。
まず、状態A、B、およびイベント1のステートマシンについて考えます。イベント1は、AからBに移動します。Aは初期状態です。
具体的には、これはネイバーを維持するためのものです。デバイスXIで、ネイバーYがhelloと言うメッセージを受け取ります。これにより、ネイバーXはこの新しいネイバーYのネイバーステートマシンをmallocします。これにより、ネイバーステートマシンが作成され、QStateMachine :: start();が呼び出されます。
このステートマシンが起動した後、このhelloメッセージの処理を続行する必要があります。だから最初はやっていた:
私の理解では、startは非同期呼び出しであり、開始が完了するまでステートマシンは最初の起動にないため、これは機能しません。それが私の最初の質問につながります。
1)それで、ステートマシンの開始はqappイベントキューに入れられますが、非同期呼び出しも発行しませんか?イベント1は開始後にイベントキューに入れられないので、初期状態になるということではないでしょうか。または、emitは非同期呼び出しではありませんか?
これが問題だと思って、ステートマシンの開始信号に関数を接続してコードを少し変更しました。次に、ステートマシンが開始されていない場合にイベントをキューに入れるようにコードを変更し、開始シグナルが呼び出された後、保留中のイベントのこのキューを処理します(そしてそれらをステートマシンに発行します)。
さて、私が信号を開始したとき、初期状態はまだ設定されていないことがわかりました。例:QStateMachine :: configuration().contains(initialstate)==false。これは私の2番目のより大きな質問につながります。
2)開始信号が出たときに初期状態になっていないのはなぜですか。
ここでのイベントのシーケンスは次のとおりです。
- ステートマシンを作成する
- 初期状態を設定する
- ステートマシンを起動します
- イベント1を受信する
- キューイベント1が開始されていないため
- 信号受信を開始しました
- イベント1を処理します
- 状態が不明なので何もしません
- イベント1を受信する
- イベント1を処理します
- 現在、状態Aにあります。状態Bに移行します。
シーケンスは次のようになります。
- ステートマシンを作成する
- 初期状態を設定する
- ステートマシンを起動します
- イベント1を受信する
- キューイベント1が開始されていないため
- 信号受信を開始しました
- イベント1を処理します
- これで状態Aになります。状態Bに移行します。
- イベント1を受信する
- イベント1を処理します
- 現在は状態Bです。何もしません。
または、イベントの方が良いです。イベントをキューに入れる必要がなかったらいいのにと思います。私はこれができたらいいのにと思います:
- ステートマシンを作成する
- 初期状態を設定する
- ステートマシンを起動します
- イベント1を受信する
- イベント1を処理します
- これで状態Aになります。状態Bに移行します。
- イベント1を受信する
- イベント1を処理します
- 現在は状態Bです。何もしません。
c++ - 状態を開始できず、状態間を移行できません:さまざまなエラーを受信します
Qtステートマシンに問題があります。状態を実行することはできません。さまざまな種類のエラーが発生し、何が問題なのか理解できません。エラーとその原因となるコードの詳細については、以下を参照してください。
これが私の主な機能です。
にブレークポイントを設定しましMyState
たが、ブレークポイントがヒットしたり、start
/stop
メソッドが実行されたりすることはありません(実際にはstart
呼び出されることだけを期待しています)。アプリケーションは直接Finisher::OnFinished
メソッドに入ります。
これが私の州のクラスです:
フィニッシャーは非常にシンプルです。
各状態の親を直接設定するなど、いくつかのことを試しました。
ただし、が呼び出されたときに状態を追加できないように思われる場合machine.addState
:
また、コンストラクターをそのままにして、呼び出しないようにしましたmachine.addState
。
ただし、この場合、次のエラーが発生します。
最後の1つは、初期状態を明示的に記述してからms1
呼び出すstart
ため、奇妙です。そのため、そこで何が問題になっているのかわかりません。この例を機能させる方法について誰かが何かアイデアを持っていますか?
qt - QStateMachine エラー状態
s1、s2、s3、s4 の 3 つの状態を持つステート マシンがあります。状態 s1、s2、および s3 から、マシンはエラー状態に入ることができます。
これを行う最善の方法は何ですか?私はそれをグーグルで調べていましたが、運がありませんでした。このようなことをしても大丈夫ですか?