2011-07-05 7 views
0

問題は主にOOP設計上の問題です。 私は、ハードウェアとの接続と通信を扱うクラスを持っています(USB経由で) - CommClass。いくつかの方法があります - connect()disconnect()read()write()です。 アプリケーション自体には、同じHWトラフCommClassと通信したい他のクラスはほとんどありません。 質問 - あなたはいつもそうしていますか? は、私は心の中でいくつかのアイデアを持っている:親クラスでまたはメインでC++アプリケーションとハードウェア通信

  1. connect()を呼び出し、すべてのクラス(コンストラクタ)へのポインタをPAS、CommClassのインスタンスを作成します。最後に - disconnect()
  2. 各クラスの各メソッドは、スタックに必要なときにCommClassオブジェクトを作成します。 - ここでの問題は、あなたがすることが予想される場合はCommClassから
  3. 使用静的メソッド...
+0

あなた自身の質問に答えました。いくつかのモジュールでCommClassを共有している場合、それらの間で共通の変数を共有するよりも何も変わりません。最良の方法は、それを使用するすべてのモジュールへのポインタとして渡す可能性が高い方法です。 – Lundin

+0

あなたがルンディンに言及したように、答えがあります。あなたがあなたの答えに満足していない場合は、ここで問題の声明を共有し、同時に問題を再訪します。何が欠けているか調べる。クラスダイアガラムやデザインは常に問題文に基づいています。問題の文が明確でない場合は、誰も良い設計を与えることができません。 – Kamahire

答えて

0

...それはUSBにし、そのたびにハンドルを要求するためにconnect()メソッドをコールしなければならないことです(USBデバイスと言えば)CommClassまたはICommClassの1つのインスタンスを持つ方が、より洗練されたデザインを持ち、CommClassによって実装されたインターフェイスで作業したい場合は、デバイスとの接続が1つだけです。また、接続(クラスまたはインターフェイス)をsingletonにラップすることもできます。これにより、接続が1回だけ行われるようにすることができます。これは、単一のスレッドアプリケーションで一度に1つの接続を使用する場合に最適です。マルチスレッドまたはマルチ接続環境では、object poolデザインパターンを試すことができます。

+0

リンクをありがとう。それが私が探していたものです - いくつかのデザインパターン。今私は仕事のために正しいものを選ぶ必要があります。 – nchokoev

0

私は最高の解決策は、アプリケーションの要件と通信接続の性質に大きく依存すると思います。最も単純なケースでは、(1)で説明した内容が適切であると思われます。

個人的には、私はほとんど常に通信を別のスレッドに入れます。もう少し複雑ですが、通信に奇妙なことが起こった場合(USBケーブルが引っ張られるなど)、応答速度が向上し、UIが応答しなくなることがあります。

私が最も頻繁に使用した設計(RS232通信)は、(1)で説明した内容にわずかな違いがあります。私はcommsを実行するスレッドを作成する私のメインアプリケーションオブジェクトのメンバとしてCCommsクラスを持っています。次に、COMMスレッドにデータを渡すすべてのスレッド同期を処理するWindowsと同様の非常に簡単なメッセージシステムを使用します主なアプリケーションです。メインアプリケーションは、他のクラスからの通信メッセージを送信し、応答を関連するクラスに送り返すための簡単な関数をいくつか持っています。

少しでも助けてくれることを願っています。

+0

私はこのように始めた。スレッドは少し複雑な解決策ですが、私はそれが好きです。もう一度試してみてください。ハードウェアの応答が遅れてユーザーが要求し続ける状況(たとえば、read()ボタンをクリックした場合)はどう対処しますか?それは多くのイベントを生成します... – nchokoev

+0

私はそれに新しいメッセージを追加する前に、メッセージキューをチェックすることでそれを処理します。キューに同じID /タイプのメッセージがすでに存在する場合は、そのメッセージを破棄します。遅延されたハードウェアの応答は、通信用に別のスレッドを使用する場合とまったく同じです。UIがロックされるため、ユーザーはボタンを何度もクリックできません。私はそれがより複雑な解決策であることに同意しますが、私はそれが長期的に努力する価値があることを発見しました。 – Redeye

関連する問題