Problema con hilos
-
jueves, 16 de agosto de 2012 0:36
Bueno, supongo que mi problema se puede solucionar con hilos, mi problema es el siguiente:
Por medio de un método en el codebehind, en el evento clic de un botón, estoy enviando datos a un puerto serial, de la siguiente manera:
comPort.Write(newMsg,0,newMsg.Length); // comPort es un objeto de tipo SerialPort
Funciona muy bien al enviarlo a otros dispositivos.
En el mismo codebehid debo actualizar un richtextbox cuando entre información por el mismo puerto serial, hasta ahora tengo lo siguiente:
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
Y el metodo comPort_DataReceived:
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{string msg = comPort.ReadExisting();
DisplayData(MessageType.Incoming, msg + "\n");
}
Y el método DisplayData:
[STAThread]
private void DisplayData(MessageType type, string msg)
{
properties.DisplayWindow.Invoke(new EventHandler(delegate
{
properties.DisplayWindow.SelectedText = string.Empty;
properties.DisplayWindow.SelectionFont = new Font(properties.DisplayWindow.SelectionFont, FontStyle.Bold);
properties.DisplayWindow.SelectionColor = MessageColor[(int)type];
properties.DisplayWindow.AppendText(msg);
properties.DisplayWindow.ScrollToCaret();
}));
}Funciona muy bien cuando envío datos desde otra aplicación, el problema es que necesito mostrar los datos que envío cuando ejecuto comPort.Write(newMsg,0,newMsg.Length); en el evento clic del boton.
Ojala me puedan ayudar, he empleado largas horas buscando la solución, gracias.
- Editado Garibello jueves, 16 de agosto de 2012 0:36
Todas las respuestas
-
jueves, 16 de agosto de 2012 5:05Moderador
No veo la necesidad de aplicar [STAThread] ya que no es el entry point de un nuevo hilo.
Tampoco entiendo qué le prohibe a usted llamar a DisplayData() en el clic del botón. Ciertamente debe usted de probar si un Invoke() es necesario antes de usuarlo usando InvokeRequired, pero fuera de eso el código debería funcionarle bien. ¿Qué sucede cuando usted trata de llamar a DisplayData() desde el evento clic del botón que ejecuta comPort.Wirte()?
¿O será que necesita mostrar los datos de diferente forma?
Jose R. MCP
Code Samples -
jueves, 16 de agosto de 2012 15:10
Cordial saludo webJose
El método DisplayData recibe un string para actualizar un richTextBox, si llamo este método desde el evento clic del bóton solo podria enviarle lo que capturo desde un textBox y no lo que esta recibiendo el puerto, que pueden llegar a ser diferentes.
El event handler que declaro acá: comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived); se ejecuta cada vez que el puerto recibe información.
He realizado proceso de debug y solo puedo ver el proceso del evento clic del botón pero nunca llega al eventhandler(El debug).
En el evento clic llego hasta enviar la información al puerto, se deberia ejecutar el eventhandler pero no lo hace o al menos el modo debug no lo ve (Puede estar en otro hilo, no estoy seguro), cuando envío información desde otra aplicación si funciona el eventhandler y me acutaliza el richTextBox.
-
jueves, 16 de agosto de 2012 17:17Moderador
Pues no estoy seguro de entender el problema. Parece ser, según su segunda explicación, que usted por alguna razón está esperando recibir datos inmediatamente después de escribir datos. Supongo que esa es una posibilidad, pero no veo por qué habría una GARANTÍA de que eso ocurra, pues una cosa no tiene que ver con la otra. Si da la casualidad de que el dispositivo en el puerto COM siempre responde con datos cuando recibe datos, pues bien, entendería, pero debo hacer notar que en general esto no es una verdad absoluta: Escribir datos en el puerto no garantiza una respuesta.
Pero bueno, asumiendo que su dispositivo en el puerto COM sí se comporta de esa manera, yo diría que su código debería funcionar. Asegúrese de suscribirse al evento ANTES de que se escriban datos en el puerto COM. En Windows Forms, un buen lugar sería el Form_Load. Luego remueva [STAThread] pues no es necesario. Finalmente, asegúrese de usar Invoke() únicamente cuando la propiedad InvokeRequired es true.
Jose R. MCP
Code Samples- Marcado como respuesta Garibello jueves, 16 de agosto de 2012 18:39

