Pregunta

Mi problema: tengo un evento DataReceived para SerialPort, que escucha el puerto serie y agrega todo a RichTextBox. Ahora me gustaría guardar el contenido de RichTextBox en el archivo txt. Podría hacer esto:

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

Pero me temo (y corrígeme si me equivoco), que solo entre mis dos acciones (guardar contenido en variable, borrar RichTextBox) otra entrada podría venir a SerialPort. Debido a que no lo guardé en mi variable y borro RichTextBox inmediatamente después, esta nueva información podría eliminarse, sin siquiera saber que alguna vez existió.

¿Podría suceder esto realmente y cómo puedo evitarlo?

Gracias

¿Fue útil?

Solución

Debe sincronizar sus entradas desde el puerto serie de alguna manera. Supongo que usa Invoke en el evento DataReceived. Por lo tanto, cualquier cambio en el contenido de RichTextBox lo realiza el hilo principal y debe estar seguro.

Pero como la transmisión desde el puerto serie es poco probable que sea RTF (si lo fuera, tendría otros problemas), también podría usar un TextBox (MultLine = true).

Otros consejos

Esto podría suceder si está utilizando múltiples hilos. En una aplicación de subproceso único, este problema no ocurriría.

Para evitar esto, puede usar mutex. Así es como funciona: los fragmentos de código que funcionan en los contenidos de RichTextBox no deben ejecutarse simultáneamente. Estos fragmentos de código se denominan secciones críticas. Cuando ingresa a una sección crítica, bloquea el mutex y lo libera al salir de la sección crítica. Si un mutex está bloqueado cuando intenta ingresar a una sección crítica, espere hasta que se libere ese mutex y luego haga su trabajo.

De esta manera, si alguna entrada llega a través del puerto serie mientras se escribe en el archivo, el hilo que recibe los datos esperará hasta que finalice la E / S del archivo y luego lo agregará al RichTextBox.

Puede lograr esto utilizando el lock declaración en c #.

Lectura adicional: Mutex , Sección Crítica

Absolutamente eso podría suceder (y probablemente lo haría).

A menos que haya otras consideraciones, creo que sería mejor que use los datos de la secuencia SerialPort para escribir el archivo de texto directamente, en lugar de escribir en el archivo usando RichTextBox.Text. El controlador de eventos DataReceived debería verse así ...

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top