Pergunta

Meu problema: Eu tenho evento DataReceived para SerialPort, que escuta a porta serial e acrescenta tudo a RichTextBox. Agora eu gostaria de salvar o conteúdo do RichTextBox para arquivo txt. Eu poderia fazer isso:

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

Mas temo (e por favor me corrijam se eu estiver errado), que só entre as minhas duas ações (salvar conteúdo para variável, RichTextBox claro) outra entrada poderia vir a SerialPort. não porque eu fiz salvou a minha variável e eu claro RichTextBox logo depois, estes novos dados poderiam ser apagados, sem mim mesmo sabendo que já existiu.

Isso poderia realmente acontecer e como posso evitá-lo?

Graças

Foi útil?

Solução

Você tem que sincronizar suas entradas a partir do porto de série de alguma forma. Eu suponho que você usar Invoke em caso DataReceived. Assim, quaisquer alterações ao conteúdo do RichTextBox são feitas pelo thread principal e você deve ser seguro.

Mas, como o fluxo da porta serial é improvável que seja RTF (você teria outros problemas se fosse), assim como você pode usar uma caixa de texto (MultLine = true).

Outras dicas

Isso pode acontecer se você estiver usando vários segmentos. Em uma única aplicação fio, este problema não ocorreria.

Para evitar isso, você pode usar exclusão mútua. É assim que funciona: O código trechos que o trabalho sobre o conteúdo do RichTextBox não deve ser executado simultaneamente. Esses trechos de código são chamados de seções críticas. Quando você entra em uma seção crítica, você travar o mutex e liberá-lo ao sair da seção crítica. Se um mutex é bloqueado quando você tentar inserir uma seção crítica, espera até que mutex é liberado, em seguida, fazer o seu trabalho.

Desta forma, se qualquer entrada vem através da porta serial ao gravar o arquivo, o segmento que recebe os dados irá esperar até que o arquivo I / O está terminado e, em seguida, anexá-lo ao RichTextBox.

Você pode conseguir isso usando a bloqueio declaração em C #.

Além disso leitura: Mutex , Seção Critical

Absolutamente que poderia acontecer (e provavelmente seria).

A menos que haja outras considerações, acredito que seria melhor servido usando os dados do fluxo SerialPort para gravar o arquivo de texto diretamente, ao invés de escrever para o arquivo usando o RichTextBox.Text. O manipulador de eventos DataReceived deve ser algo como isto ...

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top