Непонятки с потоками (попытка доступа к элементу управления не из того потока, в котором он был создан) - C#
Формулировка задачи:
Здравствуйте коллеги.
Подскажите пожалуйста, как реализовать вывод на форму информации записанной в регистрах устройства, подключенного к последовательному порту компьютера.
На данный момент я могу при помощи готового кода реализовать чтение только одного регистра и вывод его на форму. При попытке вывести хотя бы два, при запуске приложения возникает ошибка потоков.
Для вывода одного использую этот код:
Сначала думал что достаточным будит добавить в этом коде строчки например:
однако нет))
Как быть пока не знаю…может кто чем сможет помоч.
Заранее спасибо.
#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);
}
#endregionthis.Indication2.Items.Add(paramString)
Решение задачи: «Непонятки с потоками (попытка доступа к элементу управления не из того потока, в котором он был создан)»
textual
Листинг программы
public void DoGUIUpdate(string paramString)
{
// Это свойство показывает, что метод нужно вызывать через инвок, т.к. контрол находится в другом потоке
if (this.InvokeRequired)
{
// Создаем делегат для метода DoGUIUpdate
GUIDelegate delegateMethod = new GUIDelegate(this.DoGUIUpdate);
// Вызываем делегат delegateMethod
this.Invoke(delegateMethod, new object[] { paramString });
}
else
this.Indication1.Items.Add(paramString);