2017-01-31 17 views
2

私はシステムを構築しようとしています。システムは、メインステートマシンによって編成され、実行中のタスクに対して異なるサブステートマシンを持っています。長年のQtユーザーだったので、私はQt 5.8で新しいSCXML実装を検討しました。しかし、サブステートマシンを適切に実装するために5.8で提供されているAPIを使用する方法を理解することはできません。Qt 5.8サブステートマシンでSCXMLフレームワークを使用するには?

私の考えは、メイン・ステート・マシンを使用して、メインステートマシンの状態で特定のサブステートマシンを起動することです。サブステートマシンを呼び出すと、トップステートのマシンオブジェクトが発行された後にアクセスする方法を理解できませんでしたinvokedServicesChanged(..)QScxmlInvokableServiceへのポインタにアクセスできますが、関連するステートマシンにはアクセスできません。

もトップレベルのステートマシンオブジェクトのみを上からではなく呼び出されたステートマシンからの状態およびイベントを公開します。たとえば、topLevelStateMachine->activeStateNames()はトップの状態のみを表示します。

Qtのソースコードを見ると、QScxmlInvokableServiceは、実際には関連するステートマシンへのポインタを含むQScxmlScxmlServiceの基本クラスです。残念ながら、QScxmlScxmlServiceは、qscxmlinvokableservice_p.hで定義されています。これは、その名前に_pと表示されます。では、公開SCXML APIをどのように使用するのですか?何か不足していますか? IIRC SCXMLサポートは、5.7の技術プレビューでしたが、正規分布の一部として5.8に含まれています。

+1

これはAPIの監督です。自由に 'QT + = scxml_private'をプロジェクトに追加し、実装の詳細を使って必要な作業を行います。 Qtモジュールは全く新しく、はい、それを有用にするために必要なビットがほとんどありません。 –

+0

"サブステートマシン"と言うときは、 '.scxml'ステートマシンを別にしているか、[複合ステート](https://www.w3.org/TR/scxml/#N10192)を参照していますか?前者なら、なぜ後者ではないでしょうか? – Phrogz

+0

ステートマシンは別です。私は、1つのXMLファイルで大きなステートマシンを使用することは良い考えではないと考えていますが、理論的には複合状態で解決することもできます。 SCXMLとQtを使用して、多くのサブ状態を持つ大きな状態図をどのように整理しますか? – Nils

答えて

0

私は例を検討し、それに反応する私自身のステートマシンとコードを書い先週かそこら過ごしました。ドキュメンテーションはできるだけ明確ではないので、しばらく時間がかかりました。

私はactiveStateNamesは、サブ状態を含むステートマシン内に含まれるすべての状態を、取得しないことを見出しました。

これを理解するには、traffic light exampleの2つの読みがありました。重要なのは、サブステートマシンが特定の状態に含まれていることです。

この例では、オーバーオールの最上位マシンには、workingbrokenの2つの状態しかありません。遷移はイベントsmashrepairによって制御されます。二つの状態の各々内

が小さい状態機械です。 Brokenは、2つの状態の状態マシン:blinkingunblinkingを含んでいます。 brokenと入力すると、状態マシンは状態blinkingで開始します。 broken

場合サブ状態でblinkingfalse(不履行)またはblinkingbrokenで呼び出された場合trueで呼び出されたときに、activeStateNamesはblinkingを返します。

それでは、どのようにこれを使用するのですか?

特定の状態に応じて設定/解除したいものがある場合は、マシン内でconnectToStateとすることができます。私が接続するスロットは、アクティブと非アクティブの間で状態が変化したときに呼び出され、状態がアクティブであればブール値を受け取ります。信号機の例では、状態redredLightに接続されています。 redLightredの状態でオンになっている必要があり、それ以外の場合はスロットに接続されています。trueがオンになり、falseがオフになります。

大丈夫ですが、状態に入ったときにイベントをキャッチしたいのですが?

単純に状態を選択してから、onEntry - > sendを追加してイベント名を指定します。これにより、状態に入るとイベントが送信されます。このイベントは、connectToEventを使用してスロット(Qt 5.8)にルーティングできます。 [Qt 5.7のバージョンには、eventOccurredの一般的な信号しかありません。この信号をスロットに送り、event.name()を使ってどのイベントに問い合わせることができますか?]

関連する問題