Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Непонятки с потоками


Автор: arkonst 16.11.2007, 10:32
Здравствуйте коллеги.

Подскажите пожалуйста, как реализовать вывод на форму информации записанной в регистрах устройства, подключенного к последовательному порту компьютера.

На данный момент я могу при помощи готового кода реализовать чтение только одного регистра и вывод его на форму. При попытке вывести хотя бы два, при запуске приложения возникает ошибка потоков.

Для вывода одного использую этот код:

  #region GUI Объявление делегатов
        public delegate void GUIDelegate(string paramString);
        public delegate void GUIClear();
        public delegate void GUIStatus(string paramString);
  #endregion


        #region Функции делегатов
        public void DoGUIClear()
        {
            if (this.InvokeRequired)
            {
                GUIClear delegateMethod = new GUIClear(this.DoGUIClear);
                this.Invoke(delegateMethod);
            }
            else
               
            this.Indication1.Items.Clear();
            
        }
        public void DoGUIStatus(string paramString)
        {
            if (this.InvokeRequired)
            {
                GUIStatus delegateMethod = new GUIStatus(this.DoGUIStatus);
                this.Invoke(delegateMethod, new object[] { paramString });
            }
            else
                this.lblStatus.Text = paramString;
        }
        public void DoGUIUpdate(string paramString)
        {
            if (this.InvokeRequired)
            {
                GUIDelegate delegateMethod = new   GUIDelegate(this.DoGUIUpdate);
                this.Invoke(delegateMethod, new object[] { paramString });
            }
            else
                
                this.Indication1.Items.Add(paramString);
        }
        #endregion


Сначала думал что достаточным будит добавить в этом коде строчки например:

this.Indication2.Items.Add(paramString)
однако нет)) 

Как быть пока не знаю…может кто чем сможет помоч.
Заранее спасибо.

Автор: arkonst 16.11.2007, 10:57
Забыл еще привести кусок кода...

 #region Poll Function
        private void PollFunction()
        {
            //Обновление GUI:
            DoGUIClear();
            pollCount++;
            //Количество опрашиваемых регистров.
            short[] values = new short[1];
            ushort pollStart;
            ushort pollLength;
            pollStart = 6;
            pollLength = 1;

            //Чтение регистров и перевод в нужный формат:
            try
            {
                while (!mb.SendFc3(1, pollStart, pollLength, ref values)) ;
            }
            catch (Exception err)
            {
                DoGUIStatus("Error in modbus read: " + err.Message);
            }
            int i = 0;
            string itemString;
            //Вывод на форму.
            itemString = values[i].ToString();
            DoGUIUpdate(itemString);
        }
        #endregion


Тут как раз и происходит чтение регистра, а код выше используется для вывода на форму.

Автор: CYBERDREAM 16.11.2007, 11:00
запихни лучше код в соответсвующие теги, читабельнее будет

Автор: archeg 16.11.2007, 11:31
Цитата(CYBERDREAM @  16.11.2007,  11:00 Найти цитируемый пост)
запихни лучше код в соответсвующие теги, читабельнее будет 

и напиши что за
Цитата(arkonst @  16.11.2007,  10:32 Найти цитируемый пост)
 ошибка потоков.

вылетает smile 

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

Автор: AnTON_G 16.11.2007, 12:22
http://forum.vingrad.ru/forum/topic-88154/unread-1/hl/cross/index.html
там как раз написано как получить доступ из вторичного потока к элементам формы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)