だから私はQtのQStateMachineの問題を理解しようとしています。そして、誰かがこれが起こっている理由を説明するのを手伝ってくれることを望んでいます。修正だけでなく、QStateMachineの基本的な理解に非常に興味があります。
まず、状態A、B、およびイベント1のステートマシンについて考えます。イベント1は、AからBに移動します。Aは初期状態です。
具体的には、これはネイバーを維持するためのものです。デバイスXIで、ネイバーYがhelloと言うメッセージを受け取ります。これにより、ネイバーXはこの新しいネイバーYのネイバーステートマシンをmallocします。これにより、ネイバーステートマシンが作成され、QStateMachine :: start();が呼び出されます。
このステートマシンが起動した後、このhelloメッセージの処理を続行する必要があります。だから最初はやっていた:
QStateMachine::start( ) ;
emit event 1 ;
私の理解では、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です。何もしません。