| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .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 |
и напиши что за вылетает |
| Автор: 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 там как раз написано как получить доступ из вторичного потока к элементам формы |