Цитата
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления '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]);
}
}
Как правильно поступить с выводом информации? Прошу помочь. Спасибо.
Живи днем так, чтобы ночью ты спал спокойно.