0

(Qt) を使用してユーザー インターフェイスを作成し、プロセス間通信の形式として共有メモリを使用して C/C++ モーション アプリケーションに接続しています。

現在、多くのメンバーを持つモーション アプリケーションで作成したクラスがあります。これらのメンバーのほとんどは、UI 上のデータを更新するために使用され、そのうちのいくつかは 1 秒間に約 20 ~ 50 回更新されるため、かなり高速です (理由は、モーションを追跡しているためです)。私の問題は、データが UI で頻繁に更新されないことです。数秒ごとに更新されます。「揮発性」を使用して、アプリケーションの構造体で作成された他の変数を使用して機能させることができましたが、クラスのメンバーに対しては機能していないようです。データを更新するサイクルごとにコマンドを使用しているにもかかわらず、アプリケーションで実際のメンバー データが更新されていないことがわかったため、問題が UI (Qt) 側にないことはわかっています。

メンバーが構造体のように揮発性として宣言されていないため、最適化が行われていることが問題であると確信していましたが、揮発性にするとまだ機能しませんでした。モーション アプリケーション内のモーション データを更新する関数でコメントを介して印刷すると、コメントを印刷するコマンドがコンパイラ フォームの最適化を阻止するかのように、UI がより頻繁に更新されることがわかりました。

誰かがこの問題を経験したことがありますか、または可能な解決策を持っていますか?

よろしくお願いいたします。お早めにどうぞ!

編集: インターフェイスは完全にフリーズしません。意図したとおりに継続的に更新するのではなく、数秒ごとに更新するだけです。さまざまなテストを使用して、問題が GUI または共有メモリ側にないことがわかっています。問題は厳密にはモーション アプリケーション側にあります。私が呼び出している関数は以下のとおりです: int

`motionUpdate(MOTION_STAT * stat)
{
positionUpdate(&stat->traj);
} 
`

どこ

positionUpdate(){stat->Position = motStatus.pos_fb;}

Position は、x、y、および z を含むクラス メンバーです。positionUpdate() の前にコメントを出力しない限り、関数は位置の値を更新しないようです。UI を更新するために共有メモリの変更を追跡するのではなく、サイクルごとに UI を更新するだけです。

4

1 に答える 1

0

特に Qt を使用している場合は、「ネイティブ」共有メモリを使用せず、代わりにシグナルを使用することを強くお勧めします。メッセージ パッシング (シグナル/スロットはそのような方法の 1 つです) を使用した同時実行は、メモリを共有しようとするよりも、推論とデバッグがはるかに簡単です。

更新に関する問題は、UI が十分な時間呼び出されていないため、実行する更新のバックログがあることだと思います。

更新間隔が 0.3 秒未満の場合に更新を破棄するコードを挿入してみて、それが役立つかどうかを確認してください。その数を調整したいかもしれませんが、大きい方から始めてください。

次に、GUI スレッドを実行する機会が与えられていない「notspots」がアプリにないことを確認してください。存在する場合は、コードを別のスレッドに配置するか、コードのその部分内で processEvents() を呼び出すことを検討してください。

上記が実際に起こっていることではない場合は、プログラムのアーキテクチャに関する情報を追加することをお勧めします。

于 2013-06-16T13:32:06.930 に答える