質問
私の問題:SerialPortのDataReceivedイベントがあります。これはシリアルポートをリッスンし、すべてをRichTextBoxに追加します。次に、RichTextBoxのコンテンツをtxtファイルに保存します。これができました:
string text = RichTextBox.Text;
// save file
RichTextBox.Clear();
ただし、2つのアクション(変数へのコンテンツの保存、RichTextBoxのクリア)の間に、SerialPortに別の入力が送られるのではないかと心配しています(間違っている場合は修正してください)。変数に保存せず、RichTextBoxをすぐにクリアするため、この新しいデータは削除されますが、それが存在することさえ知らずに。
これは本当に起こり得ますか、どうすれば回避できますか?
ありがとう
解決
何らかの方法でシリアルポートからの入力を同期する必要があります。 DataReceivedイベントでInvokeを使用すると仮定します。したがって、RichTextBoxの内容への変更はメインスレッドによって行われ、安全である必要があります。
ただし、シリアルポートからのストリームがRTFである可能性は低いため(他の問題がある場合)、TextBox(MultLine = true)を使用することもできます。
他のヒント
これは、複数のスレッドを使用している場合に発生する可能性があります。シングルスレッドアプリケーションでは、この問題は発生しません。
これを防ぐには、ミューテックスを使用できます。これがどのように機能するかです。RichTextBoxのコンテンツで機能するコードスニペットは、同時に実行されるべきではありません。これらのコードスニペットは、クリティカルセクションと呼ばれます。クリティカルセクションに入ると、クリティカルセクションを出るときにミューテックスをロックして解放します。クリティカルセクションに入ろうとしたときにmutexがロックされている場合は、そのmutexが解放されるまで待ってから仕事をしてください。
この方法では、ファイルへの書き込み中にシリアルポートから入力があった場合、データを受信するスレッドはファイルI / Oが終了するまで待機してから、RichTextBoxに追加します。
ロックを使用して、これを達成できます c#のステートメント。
絶対にそうなる可能性があります(おそらくそうなるでしょう)。
他の考慮事項がない限り、RichTextBox.Textを使用してファイルに書き込むよりも、SerialPortストリームのデータを使用してテキストファイルを直接書き込む方が良いと考えています。 DataReceivedイベントハンドラは次のようになります...
private void SerialPort1.DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string DataText = // code to read the serialport data and convert
//it into a string, which you already have so I
//won't repeat it here.
WriteToTextBox(DataText);
WriteToFile(DataText);
}