Avatar billede koppelgaard Praktikant
07. februar 2013 - 20:49 Der er 2 kommentarer og
1 løsning

cross threading

Jeg har en klasse ved navn sartorius
I constucteren oprettet en serielports som åbnes.
I klassen henter metoden "GetData" data.

I formen startes en system.timers.timer.
Hver gang timeren kører hentes data med klassen sartorius metode getData
Køres denne timer med for hurtigt bliver getData kaldt igen før den bliver afsluttet.

Hvad kan jeg gøre.
Lade være med at kører timeren for hurtigt kunne være et svar.
Men kunne man ikke stoppe eventuelt andre tråde, der bruger getData, så der ikke opstår cross threading?

fejlmeddelse:"The I/O operation has been aborted because of either a thread exit or an application request."

using System;
using System.IO.Ports;
using System.Windows.Forms;

namespace Ksat
{
    class Sartorius
    {
        SerialPort port;
        string data;

        public Sartorius(string portName, int baudRate, Parity parity, int dataBits)
        {
            port = new SerialPort(portName, baudRate, parity, dataBits);
            port.Handshake = Handshake.None;
            port.DtrEnable = true;
            port.ReceivedBytesThreshold = 1;

            if(!port.IsOpen) port.Open();           
        }


        public string[] GetData()
        {
            string[] result = new string[] { "NaN", "NaN" };
            string command = ((char)27).ToString() + ((char)80).ToString() + ((char)13).ToString() + ((char)10).ToString();
         
            port.DiscardInBuffer();
            port.DiscardOutBuffer();
            port.Write(command);
                     
            bool found = false;
            DateTime startTime = DateTime.Now;

            while (!found & DateTime.Now.Subtract(startTime).TotalSeconds < 2)
            {
                char c = (char)port.ReadChar();
                data += c.ToString();

                if (c.ToString() == "\r")
                {
                    found = true;
                    string tmp= data.Replace("g", "").Replace("\r", "").Replace(" ", "");
                    result = new string[] { tmp, data };                   
                }
            }

            data = "";
            return result;
        }     
    }
}

using System;
using System.IO.Ports;
using System.Windows.Forms;

namespace WindowsFormsApplication_test
{
    public partial class Form1 : Form
    {
        delegate void TextboxDelegate(string text, TextBox textbox);
        System.Timers.Timer aTimer;
        Ksat.Sartorius sart;

        public Form1()
        { 
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            sart = new Ksat.Sartorius("COM12", 1200, Parity.Odd, 7);
            aTimer = new System.Timers.Timer();
            aTimer = new System.Timers.Timer(100);
            aTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
            aTimer.Start();
        }

        private void TxtToTextBox(string txt, TextBox textbox)
        {
            if (textbox.InvokeRequired)
                textbox.Invoke(new TextboxDelegate(TxtToTextBox), txt, textbox);
            else
            {
                textbox.Text = txt;
            }
        }

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

        private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
        {
            string[] data = sart.GetData();
            TxtToTextBox(data[0], this.textBox1);
         
        }
    }
}
Avatar billede janus_007 Nybegynder
07. februar 2013 - 22:06 #1
Stop timeren:

private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
        {
try
{
            aTimer.Stop();
            string[] data = sart.GetData();
            TxtToTextBox(data[0], this.textBox1);
           
          }
finally
{
aTimer.Start();
}
        }
Avatar billede koppelgaard Praktikant
08. februar 2013 - 10:13 #2
Simpelt og perfekt - tak :)
Avatar billede koppelgaard Praktikant
08. februar 2013 - 10:15 #3
GetData er i øvrigt rettet fordi

char c = (char)port.ReadChar();

gav en fejl når det ikke var noget i porten at læse:





public string[] GetData()
        {
            string[] result = new string[] { "NaN", "NaN" };
            string command = ((char)27).ToString() + ((char)80).ToString() + ((char)13).ToString() + ((char)10).ToString();
         
            port.DiscardInBuffer();
            port.DiscardOutBuffer();
            port.Write(command);
            int n = port.BytesToRead;
                     
            bool found = false;
            DateTime startTime = DateTime.Now;


            while (!found & DateTime.Now.Subtract(startTime).TotalSeconds < 0.5)
            {
                if (port.BytesToRead > 0)
                {
                    char c = (char)port.ReadChar();

                    data += c.ToString();

                    if (c.ToString() == "\r")
                    {
                        found = true;
                        string tmp = data.Replace("g", "").Replace("N", "").Replace("\r", "").Replace(" ", "");
                        result = new string[] { tmp, data };
                        Console.Beep();
                    }
                }
            }

            data = "";
            return result;
        }
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