2011-10-06 3 views
0

シリアルポートを監視し、データをファイルに書き込むシンプルなシリアルポートデータロギングアプリケーションを作成しようとしています。 データの間隔が長い場合、ファイルが閉じられ、新しいファイルが開始されます。 私はタイマーを使用してファイルをいつ閉じるかを決定します。シリアルイベントハンドラを使用してファイルを開きます。シリアルポートイベントハンドラは、メインコードでNUllのオブジェクトを作成します

問題は、ファイルを閉じるとファイルオブジェクトがnullと思われることです。ファイル自体は、私のサンプルコードから削除された他のものと同じように、別のオブジェクトによって作成されます。

何らかの理由で、シリアルイベントハンドラによって作成されたオブジェクトは有効ですが、オブジェクト内のファイルはnullです。

私は非常に経験豊富なCおよびLinuxのカーネルプログラマですが、C#の新機能であるため、構文とオブジェクトの性質はまだ引き分けます しかし、私はオブジェクトのコンテキストをどこかに失っていない限り、これがうまくいかない理由はわかりません。 これは4つのシリアルポートオブジェクトが同時に開かれて4つの異なるファイルに書き込まれるため、問題になる可能性があります。

私はすでにFOrms.timerからTimers.timerへのchanによってシリアルハンドラから呼び出されたときに動作しないタイマーの問題を解決しました。 私はそのスレッドの問題かどうか疑問に思っています。

あなたが流すことのできる光は大歓迎です。

class CommGroup 
{ 
    private SerialPort _comPort; 
    private System.Timers.Timer myTimer; 
    private ResultsLog logFile = null; 

    public CommGroup() 
    { 
     _comPort = new SerialPort(string name); 
     _comPort.PortName = name; 
     _comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
     _comPort.Open(); 

     myTimer = new System.Timers.Timer(); 
     myTimer.Elapsed += new System.Timers.ElapsedEventHandler(TimerEventProcessor); 
    } 

    private void TimerEventProcessor(Object myObject, 
              EventArgs myEventArgs) 
    { 
     System.Timers.Timer timer = (System.Timers.Timer) myObject ; 
     timer.Stop(); 

     if (logFile != null) 
     { 
      logFile.Close(); /* this fails due to null object */ 
     } 
    } 

    private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     if (myTimer.Enabled == false) 
     { 
      myTimer.Interval = 5000; 
      myTimer.Start(); 
     } 
     else 
     { 
      myTimer.Stop(); 
      myTimer.Interval = 5000; 
      myTimer.Start(); 
     } 

     if (logFile == null) 
     { 
      logFile = new ResultsLog("Filename"); 
     } 
     logFile.LogResult(sp.ReadExisting()); 
    } 
} 

public class ResultsLog 
{ 
    private StreamWriter resultFile; 

    public ResultsLog(string filename) 
    { 
      StreamWriter resultFile = new StreamWriter(filename, true); 
    } 

    public void Close(string errorname) 
    { 
     if (this.resultFile != null) 
     { 
      resultFile.Flush(); 
      resultFile.Close(); 
     } 
     else 
     { 
      MessageBox.Show("File NULL Error " + errorname, "File Close"); 
     } 
    } 

    public void LogResult(string result) 
    { 
     if (resultFile != null) 
     { 
      resultFile.Write(result); 
     } 
    } 
} 

答えて

0

同期化を行わずにログオブジェクトにアクセスする複数のスレッドがあるため、スレッド化する可能性があります。

varibaleへのアクセスをロックして、役立つかどうか確認してください。

2

あなたの結果ファイルは面倒なヌルですか?

ResultsLogコンストラクタでローカルに再宣言しています。する必要があります:

public ResultsLog(string filename) 
{ 
     resultFile = new StreamWriter(filename, true); 
} 
+0

その1つをうまくキャッチ! – tcarvin

関連する問題