实时更新图表跨线程操作无效

时间:2018-10-31 23:52:45

标签: multithreading charts timer

我正在尝试为我的应用程序构建GUI。我陷入一个问题。我尝试使用计时器“ OnTImedEvent”来调用函数以更新图表。不幸的是,MVS给我“跨线程操作无效”。我遇到了一些有关委托的提示,但我无法使其正常运行。由于我在WindowsFormsApp(今天开始)中处于nooby状态,因此要求您的帮助。这是我的代码:

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

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        bool state = false;
        private static System.Timers.Timer timer;
        public Form1()
        {
            InitializeComponent();
            timer = new System.Timers.Timer(10);
            timer.Elapsed += OnTimedEvent;
            timer.AutoReset = true;
            timer.Enabled = true;      
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.WriteLine("a\n");
            }
            else
                MessageBox.Show("Brak połączenia z urządzeniem");
        }

        private void button4_Click(object sender, EventArgs e)
        {

            if (serialPort1.IsOpen)
            {
                Form2 form2 = new Form2(serialPort1);
                form2.Show();
            }
            else
                MessageBox.Show("Brak połączenia z urządzeniem");
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            comBoxPort.Items.AddRange(ports);
        }

        private void btnCon_Click(object sender, EventArgs e)
        {
            if (state)
            {
                state = false;
                btnCon.ForeColor = Color.Red;
                try
                {
                    serialPort1.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }
            else
            {
                state = true;
                btnCon.ForeColor = Color.Green;
                try
                {
                    serialPort1.PortName = comBoxPort.Text;
                    serialPort1.Open();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }

        }

        private void btnRoll_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.WriteLine("s\n");
            }
            else
                MessageBox.Show("Brak połączenia z urządzeniem");
        }

        private void btnYAW_Click(object sender, EventArgs e)
        {
            drawChart();
            if (serialPort1.IsOpen)
            {
                serialPort1.WriteLine("d\n");
            }
            //else
                //MessageBox.Show("Brak połączenia z urządzeniem");
        }
        private void drawChart()
        {
            chart1.Series["PITCH"].Points.AddY(21);
            chart1.Series["ROLL"].Points.AddY(122);
            chart1.Series["YAW"].Points.AddY(13);
        }
        public delegate void drawChartCallback();
        private void chart1_Click(object sender, EventArgs e)
        {

        }        
        private void OnTimedEvent(Object source, ElapsedEventArgs e)
        {
            drawChart();
        }
    }
}

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

虽然这不是最佳方法,但对于初学者而言,避免该问题的简便方法是使用以下变量form.CheckForIllegalCrossThreadCalls = false;