No se lee con corrección multiproceso de delegado y no aparece ningún formulario

Necesito actualizar una etiqueta de formulario de Windows con una cadena recibida del puerto serie. Tengo dos problemas con el código que ya hice.

Debido a que la lectura del puerto serie necesita otro hilo, utilizo un método de delegado para actualizar el texto de la etiqueta.

El primer problema es que la ventana del formulario no se abre cuando inicio el programa (sí se abre cuando no llamo initSerialPort() in Form1_Load()).

El segundo problema es que parece que no alcanza Debug.Write(message) cuando llamo _self.SetText(message) in Read(). cuando comento _self.SetText(message) registra el mensaje pero tampoco abre la ventana del formulario porque initSerialPort() se llama en Form1_Load()

Soy un poco novato con C#, para que lo sepas ;)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        delegate void SetTextCallback(string text);

        private static SerialPort _serialPort;
        private static Boolean _continue;
        private static StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        private static Thread readThread = new Thread(Read);
        private static Form1 _self;
        private static Label _lbl;

        public Form1()
        {
            InitializeComponent();
            _self = this;

            _lbl = label1;

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            initSerialPort();
        }

        public void setMessage(string mes)
        {
            label1.Text = mes;
        }

        private static void initSerialPort()
        {
            // Create a new SerialPort object with default settings.
            _serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

            // Set the read/write timeouts
            _serialPort.ReadTimeout = 500;
            _serialPort.WriteTimeout = 500;

            _serialPort.Open();
            _continue = true;
            readThread.Start();

            readThread.Join();
            _serialPort.Close();
            _serialPort = null;
        }

        public static void Read()
        {
            Debug.Write("testread");
            while (_continue)
            {

                try
                {
                    String message = _serialPort.ReadLine();

                    _self.SetText(message);

                    Debug.Write(message);


                }
                catch (TimeoutException) { }

            }
        }

        private void SetText(string text)
        {
            // InvokeRequired required compares the thread ID of the
            // calling thread to the thread ID of the creating thread.
            // If these threads are different, it returns true.
            if (this.label1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.label1.Text = text;
            }
        }
    }
}

preguntado el 12 de junio de 12 a las 16:06

Debería considerar usar el evento DataReceived en lugar de ejecutar su propio hilo y usar BeginInvoke en lugar de Invoke. -

1 Respuestas

no Join al nuevo hilo que creas. Eso va a bloquear el hilo hasta que su Read el método se completa, lo que significa que nunca se completa.

Respondido el 12 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.