Com port попытка доступа к элементу управления не из того потока, в котором он был создан

des1roer
Дата: 09.06.2014 14:25:21
попытка доступа к элементу управления 'label2' не из того потока, в котором он был создан. Собственно, впытаюсь получить значения с ком порта пишет такую дрянь
//-----
using System.IO.Ports;
using System.IO;
 
namespace comSobitie
{
    public partial class Form1 : Form
    {
        // Таймер
        Timer timer = new Timer();
        // Порт
        SerialPort port = new SerialPort("COM2", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
        string value = "";
        public Form1()
        {
            InitializeComponent();
 
            // Подписались на приход данных
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
 
            // Задаем интервал таймеру
            timer.Interval = 10000;
            // Подписываемся на тики таймера
            timer.Tick += new EventHandler(timer1_Tick);
            // Стартуем таймер
            timer.Start(); 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            // Открываем порт
            if (port.IsOpen)
            {
                // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем
 
                // Закрываем
                port.Close();
            }
 
            // Открываем
            port.Open();
 
            // Чето посылаем
            port.Write("#10\r");
        }
        int i = 0;
        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);
                // Получаем пришедшие данные
               string indata = port.ReadExisting();
                
                // Чето с ними делаем
             MessageBox.Show(i++.ToString() + " " + indata); - это работает
          label1.Text = indata; - это нет
          
         
           
 
                // Закрываем порт
                if (port.IsOpen) port.Close();
               }
       
        }
des1roer
Дата: 09.06.2014 14:35:05
нашел такую реализацию. но как бы передать значение indata в глобальную переменную value




 if (label1.InvokeRequired) label1.Invoke(new Action<string>((s) => label1.Text = s), indata);
               else label1.Text = indata;
D129
Дата: 09.06.2014 15:03:58
des1roer,


Вы движетесь в правильном направлении,

Пункт 7 посмотрите:


Самые популярные вопросы
des1roer
Дата: 10.06.2014 06:32:35
там опять же с лэйбл пример. мне то нужно в переменную передать

  private void ToLabel(string text)
        {
            if (InvokeRequired)
                Invoke((Action<string>)ToLabel, text);
            else
                label1.Text = text;
        }
   ToLabel(indata);
так канает. но это не то
если пытаюсь так
value = label1.Text;

то Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан.
LameUser
Дата: 10.06.2014 08:29:48
des1roer
там опять же с лэйбл пример. мне то нужно в переменную передать

  private void ToLabel(string text)
        {
            if (InvokeRequired)
                Invoke((Action<string>)ToLabel, text);
            else
                label1.Text = text;
        }
   ToLabel(indata);
так канает. но это не то
если пытаюсь так
value = label1.Text;

то Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан.



Ну сделайте по аналогии метод на вашей форме

public string ThreadSafeGetLabelText()
{
//аналогичный код с проверкой на InvokeRequired
}
des1roer
Дата: 10.06.2014 13:27:01
Оказывается, все ОЧЕНЬ просто -
    [color=red]String[/color] indata = port.ReadExisting();
             NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";"));
                    conn.Open();
                    String Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\",\"F_Value\",\"F_Date\")  VALUES (" + dt3.Rows[0][0].ToString() + ",\'" + indata + "\',\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\'   )");

нужно было ипользовать String а не string и ошибки не возникатет )))