реклама на сайте
подробности

 
 
> VS2010 прием по TCP, доступ к главной форме из потока
smk
сообщение Nov 23 2015, 20:35
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

В приложении, которое мне необходимо для работы нужно принимать пакет данных по ТСП и "распихивать" их по элементам главной формы. Прием ведется в отдельном потоке:
Код
                Thread th = new Thread(ReceiveRun);
                th.Start();


        // Цикл извлечения сообщений,
        // запускается в отдельном потоке.
        void ReceiveRun()
        {
            while (true)
            {
                try
                {
                    string s = null;
                    while (ns.DataAvailable == true)
                    {
                        //// Определение необходимого размера буфера приема.
                        //byte[] buffer = new byte[_tcpСlient.Available];

                        ns.Read(inBuffer, 0, inBuffer.Length);
                        s += Encoding.Default.GetString(inBuffer);
                    }

                    if (s != null)
                    {
                        ShowReceiveMessage(s);
                        s = String.Empty;
                    }


                    // Вынужденная строчка для экономия ресурсов процессора.
                    // Неизящный способ.
                    Thread.Sleep(100);
                }
                catch
                {
                    ErrorSound();
                }

                if (_stopNetwork == true) break;

            }
        }



При попытке получить пакет появляется ошибка, которую я привел в начале этого сообщения. Ошибка появляется при обработке функции отображения данных:

Код
       // Код доступа к свойствам объектов главной формы  из других потоков
        delegate void UpdateReceiveDisplayDelegate(string message);
        void ShowReceiveMessage(string message)
        {
            if (chart1.InvokeRequired == true)
            {
                UpdateReceiveDisplayDelegate rdd = new UpdateReceiveDisplayDelegate(ShowReceiveMessage);

                // Данный метод вызывается в дочернем потоке,
                // ищет основной поток и выполняет делегат указанный в качестве параметра
                // в главном потоке, безопасно обновляя интерфейс формы.
                Invoke(rdd, new object[] { message });
                chart1.Series[0].Points.Clear();
                chart1.Series[1].Points.Clear();
                chart1.Series[2].Points.Clear();
                chart1.Series[3].Points.Clear();
                chart1.Series["1,3 мкм"].Points.AddY(inBuffer[1] << 8 + inBuffer[0]);
                chart1.Series["2,11 мкм"].Points.AddY(inBuffer[3] << 8 + inBuffer[2]);
                chart1.Series["1,8 мкм"].Points.AddY(inBuffer[5] << 8 + inBuffer[4]);
                chart1.Series["1,93 мкм"].Points.AddY(inBuffer[7] << 8 + inBuffer[6]);
            }
            else
            {
                // Если не требуется вызывать метод Invoke, обратимся напрямую к элементу формы.
                chart1.Series[0].Points.Clear();
                chart1.Series[1].Points.Clear();
                chart1.Series[2].Points.Clear();
                chart1.Series[3].Points.Clear();
                chart1.Series["1,3 мкм"].Points.AddY(inBuffer[1] << 8 + inBuffer[0]);
                chart1.Series["2,11 мкм"].Points.AddY(inBuffer[3] << 8 + inBuffer[2]);
                chart1.Series["1,8 мкм"].Points.AddY(inBuffer[5] << 8 + inBuffer[4]);
                chart1.Series["1,93 мкм"].Points.AddY(inBuffer[7] << 8 + inBuffer[6]);
            }


        }


Как правильно поступить с выводом информации? Прошу помочь. Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- smk   VS2010 прием по TCP   Nov 23 2015, 20:35
- - XVR   У вас в ShowReceiveMessage жуткая мешанина из того...   Nov 25 2015, 06:37
|- - smk   Цитата(XVR @ Nov 25 2015, 08:37) У вас в ...   Nov 25 2015, 08:34
- - XVR   Конструкцию UpdateReceiveDisplayDelegate rdd = new...   Nov 25 2015, 10:15
|- - smk   Цитата(XVR @ Nov 25 2015, 12:15) Конструк...   Nov 25 2015, 14:25
- - smk   Благодарю. Сделаю как Вы сказали. Еще раз спасибо.   Nov 25 2015, 11:29
- - XVR   В контексте ReceiveRun этот элемент называется s. ...   Nov 25 2015, 14:36
- - smk   Пока получается. Остается вопрос по кнопке "о...   Nov 28 2015, 09:42
|- - XVR   Цитата(smk @ Nov 28 2015, 12:42) Пока пол...   Nov 30 2015, 11:47
|- - smk   Цитата(XVR @ Nov 30 2015, 13:47) Может се...   Nov 30 2015, 19:25
- - smk   И еще такой момент. тспклиент принимает ровно 16 п...   Nov 28 2015, 13:57
- - XVR   А что происходит после приема 16 посылок? Останавл...   Dec 1 2015, 11:42
|- - smk   Цитата(XVR @ Dec 1 2015, 13:42) А что про...   Dec 1 2015, 13:18
- - sergey sva   Может что то с отображением данных в gui. Попробуй...   Dec 2 2015, 07:54
- - smk   В прикрепленном проекте все хорошо кроме приема да...   Dec 2 2015, 14:39
- - XVR   Чтение у вас сделано мягко говоря необычно Ваш к...   Dec 2 2015, 15:05
- - smk   Спасибо. Что-то я догадываюсь как исправить, но ...   Dec 2 2015, 18:19
- - XVR   returndata и все манипуляции вокруг него не нужны ...   Dec 2 2015, 20:38
|- - smk   Цитата(XVR @ Dec 2 2015, 22:38) returndat...   Dec 3 2015, 07:50
- - XVR   ЦитатаХочу спросить, что значит "собирать пак...   Dec 3 2015, 12:36
- - smk   Судя по режиму отладки функция Display выполняется...   Dec 3 2015, 14:03
- - XVR   Нужно правильно принимать. См сообщение №20   Dec 3 2015, 14:15
- - smk   Кажись заработало. пока-что... Тестирую. Спасибо...   Dec 3 2015, 14:31
- - smk   Вот что получается. Если я кнопкой отправляю 16 за...   Dec 3 2015, 20:45
- - smk   похоже, что проблема со стороны прибора. проверю -...   Dec 4 2015, 08:13
- - XVR   А чему равен outBuffer.Length ?   Dec 4 2015, 10:15
|- - smk   Цитата(XVR @ Dec 4 2015, 12:15) А чему ра...   Dec 4 2015, 13:03
- - smk   Все отлично работает. Прием и передача ОК. Огромно...   Dec 4 2015, 23:05


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 21:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016