Domanda

Il mio problema: ho un evento DataReceived per SerialPort, che ascolta la porta seriale e aggiunge tutto a RichTextBox. Ora vorrei salvare il contenuto di RichTextBox in un file txt. Potrei farlo:

string text = RichTextBox.Text;
// save file
RichTextBox.Clear();

Ma temo (e per favore correggimi se sbaglio), solo tra le mie due azioni (salva il contenuto in variabile, cancella RichTextBox) un altro input potrebbe arrivare a SerialPort. Poiché non l'ho salvato nella mia variabile e ho cancellato RichTextBox subito dopo, questi nuovi dati potrebbero essere eliminati, senza che io sapessi nemmeno che esistessero.

Potrebbe davvero succedere e come posso evitarlo?

Grazie

È stato utile?

Soluzione

Devi in ??qualche modo sincronizzare gli input dalla porta seriale. Presumo che tu usi Invoke nell'evento DataReceived. Quindi qualsiasi modifica al contenuto di RichTextBox viene effettuata dal thread principale e dovresti essere al sicuro.

Ma poiché è improbabile che il flusso dalla porta seriale sia RTF (se lo fosse avresti altri problemi), potresti anche usare un TextBox (MultLine = true).

Altri suggerimenti

Questo potrebbe accadere se si utilizzano più thread. In un'applicazione a thread singolo, questo problema non si verifica.

Per evitarlo, puoi usare mutex. Funziona così: gli snippet di codice che funzionano sui contenuti di RichTextBox non devono essere eseguiti contemporaneamente. Questi frammenti di codice sono chiamati sezioni critiche. Quando si accede a una sezione critica, si blocca il mutex e lo si rilascia all'uscita dalla sezione critica. Se un mutex viene bloccato quando si tenta di accedere a una sezione critica, attendere fino al rilascio di tale mutex, quindi eseguire il lavoro.

In questo modo, se qualsiasi input arriva attraverso la porta seriale durante la scrittura sul file, il thread che riceve i dati attenderà fino al termine dell'I / O del file e quindi lo aggiungerà al RichTextBox.

Puoi raggiungere questo obiettivo utilizzando lock dichiarazione in c #.

Ulteriori letture: Mutex , Sezione critica

Assolutamente ciò potrebbe accadere (e probabilmente lo farebbe).

A meno che non vi siano altre considerazioni, credo che verrebbe servito meglio usando i dati dello stream SerialPort per scrivere direttamente il file di testo, piuttosto che scrivere nel file usando RichTextBox.Text. Il gestore eventi DataReceived dovrebbe assomigliare a questo ...

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top