Avatar billede keepy Seniormester
04. maj 2011 - 09:43 Der er 2 kommentarer og
1 løsning

Tråde

Hej

Håber nogle kan hjælpe mig med dette lille problem.
Jeg er ikke i samme tråd som min form og da jeg forsøger at skrive til et listview går det skidt.

Min kode virker sådan.
Der kommer et Event når der er data på comporten.
Disse data skulle gerne føres over i min form og og skrives i på skærmen i et listview. UpdateText(); i class comport.

På forhånd TAK


public partial class Form1 : Form
    {
        ListViewItem listViewItem1 = new ListViewItem();

        public Form1()
        {
            InitializeComponent();
        }
    // Delegate er lavet specielt for denne methode
        private delegate void DisplayDelegate(string text);


    //Methoden som bliver kaldt fra "arbejder tråden"
        public virtual void WriteToForm(string txt)
        {

            if (InvokeRequired)
            {
                Invoke(new DisplayDelegate(WriteToForm));
            }
            else
            {
                //the actual job is here
                listViewItem1.Text = "hej";
            }
     

        }
        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
           
        }
    }


class Comport
    {
        public SerialPort sp = null;
        public String data = "";

      public Comport()
        {
            sp = new SerialPort();
        }

        public void Comsetup(String Com)
        {
            sp.PortName = "COM" + Com;
            sp.DataBits = 8;
            sp.BaudRate = 9600;
            sp.Parity = Parity.None;
            sp.StopBits = StopBits.Two;
            sp.Handshake = Handshake.None;
            sp.DtrEnable = true;//Data Terminal Ready
            sp.RtsEnable = true;//Requist To Sent
            sp.ReadTimeout = 300;
            sp.WriteTimeout = 300;
            sp.ReadBufferSize = 1024;
            //sp.Encoding = Encoding.GetEncoding("iso-8859-1");
            sp.Encoding = Encoding.Default;
            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler);
        }

        private void DataReceviedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            int indata = sp.ReadByte();

            MessageBox.Show(indata.ToString("X"));
           
            UpdateText(indata.ToString());
         
        }
Avatar billede MindWorX Nybegynder
04. maj 2011 - 12:07 #1
...
    private delegate void WriteToFormDelegate(String text);

    public void WriteToForm(String text)
    {
        if (InvokeRequired)
        {
            Invoke(new WriteToFormDelegate(WriteToForm), text);
            return;
        }
        //Gør hvad du vil her.
    }
...
Avatar billede MindWorX Nybegynder
04. maj 2011 - 12:16 #2
Her er en mere komplet løsning. Det er rimelig kerne ting, så du kan selv arbejde videre på det.

Form1.cs
...
    public partial class Form1 : Form
    {
        private Comport _Comport = new Comport("1");

        public Form1()
        {
            InitializeComponent();

            _Comport.DataReceived += new ComportDataReceived(_Comport_DataReceived);
        }

        private void _Comport_DataReceived(Comport sender, byte data)
        {
            this.WriteToForm("Data: " + data.ToString());
        }
     
        private delegate void WriteToFormDelegate(String text);

        private void WriteToForm(String text)
        {
            if (InvokeRequired)
            {
                Invoke(new WriteToFormDelegate(WriteToForm), text);
                return;
            }
            //Gør hvad du vil her.
        }
    }
...

Comport.cs
...
    public delegate void ComportDataReceived(Comport sender, Byte data);

    public class Comport
    {
        public SerialPort SerialPort = new SerialPort();

        public Comport(String Com)
        {
            this.SerialPort.PortName = "COM" + Com;
            this.SerialPort.DataBits = 8;
            this.SerialPort.BaudRate = 9600;
            this.SerialPort.Parity = Parity.None;
            this.SerialPort.StopBits = StopBits.Two;
            this.SerialPort.Handshake = Handshake.None;
            this.SerialPort.DtrEnable = true;//Data Terminal Ready
            this.SerialPort.RtsEnable = true;//Requist To Sent
            this.SerialPort.ReadTimeout = 300;
            this.SerialPort.WriteTimeout = 300;
            this.SerialPort.ReadBufferSize = 1024;
            //sp.Encoding = Encoding.GetEncoding("iso-8859-1");
            this.SerialPort.Encoding = Encoding.Default;
            this.SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler);
        }

        private void DataReceviedHandler(Object sender, SerialDataReceivedEventArgs e)
        {
            this.OnDataReceived((Byte)SerialPort.ReadByte());
        }

        public event ComportDataReceived DataReceived;

        public void OnDataReceived(Byte data)
        {
            if (DataReceived != null)
                DataReceived(this, data);
        }
    }
...
Avatar billede keepy Seniormester
07. maj 2011 - 22:18 #3
super tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester