2

この質問を理解するのに助けが必要です。検索してみましたが、シングルトンデザインパターンを使用した解決策を見つけたかもしれませんが、確認したいと思います。

Visual C#で記述しているWindowsフォームアプリがあります。すべてのフォームで共有できるようにSerialPortクラスを作成しています(複数のシリアルポートインスタンスは必要ありません)。これは、ロジックをGUIから分離するためです。すべてのフォームは、ボーレート、書き込み、読み取りなど、SerialPortクラスにさまざまな変更を加えることができます。

このソリューションを実装するための最良の方法は何ですか?私はOOPを初めて使用するので、読み方に関する推奨事項は素晴らしいでしょう。

4

3 に答える 3

3

すでに述べたように、この問題はシングルトンデザインパターンを使用して解決できます。ここに小さなサンプルがあります:

public class MySingleton() {
    private static MySingleton instance = new MySingleton();

    //your attributes go here...
    private MySingleton() {
    //your logic goes here...
    }

    public static MySingleton getInstance() {
        return instance;
    }
}

静的インスタンスが複数のスレッドで使用される場合、クラスは共有リソースをロックする必要があることに注意してください。スレッドセーフコードへの参照を紹介します

于 2012-04-25T23:14:44.503 に答える
1

@Luiggiのソリューションの代わりに、もう少しスレッドの良心を示します。

public sealed class SerialPort
{
  private static volatile SerialPort instance;
  private static object threadLock = new Object();

  /// <summary>Retrieve an instance of SerialPort</summary>
  public static SerialPort Instance
  {
    get
    {
      if (SerialPort.instance == null)
      {
        lock (SerialPort.threadLock)
        {
          if (SerialPort.instance == null)
          {
            SerialPort.instance == new Serialport();
          }
        }
      }
      return SerialPort.instance;
    }
  }

  private SerialPort(){}
}

次に、実際には:

SerialPort sp = SerialPort.Instance;
sp.MyMethod(...);

このシングルトンパターンの詳細。

于 2012-04-25T23:27:29.377 に答える
1

実際、昨日同じ問題に遭遇したばかりで、シングルトン方式を使用する代わりに、この問題に取り組むはるかに簡単な方法を見つけたかもしれないと思います。クラスファイルを作成し、というクラスを作成しましたpublic class Serialstatic SerialPort内部で、シリアル変数を(ie static SerialPort serial);として宣言しました。タイマーを使用する必要がある場合は、タイマーと同じです。setの関数を作成し、を呼び出します。serialStatusここで、を設定しpublic static boolます。私は本当にここに自分のコードを投稿したいのですが、それを正しく行う方法が本当にわかりません。フォームでは、最初のフォームでシリアルポートを開始します。他の形式の場合、あなたがしなければならないのは、メソッドを引き出すことを宣言するSerial serial = new Serial();ことだけです、そしてあなたは行ってもいいです。シリアル設定を変更する必要がある場合は、bool入力を使用してメソッドを作成できます(つまりtrueserial.Close();次に、新しい設定でシリアルを再起動します。

于 2012-06-13T17:49:53.910 に答える