Tonny_Bennet
16-02-2012, 16:01
Здравствуйте.
Пишу на C# программу, которая будет общаться с ком портом. Создал форму. Добавил в неё объект SerialPort. Программа открывает порт. Записывает в него данные. У порта есть событие DataReceived, которое как я понимаю наступает во время получения данных. Я хочу эти данные выводить на форму в RichTexBox (в коде rtb_log). Но в момент когда из порта должен прийти ответ возникает ошибка:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "rtb_log" не из того потока, в котором он был создан.
Насколько я понимаю, все элементы формы созданы в одном потоке, а чтение из порта это другой поток. И мне нужно из одного потока работать с элементом созданным в другом потоке.
Вы не могли бы мне как можно проще и нагляднее пояснить как можно решить данную проблему? На пальцах попытаться объяснить как в данном случае работать с потоками...
private void btn_open_port_Click(object sender, EventArgs e)
{
try
{
serialPort.PortName = "COM" + tb_com.Text;
serialPort.Open();
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
private void btn_write_Click(object sender, EventArgs e)
{
try
{
string s = tb_write.Text + "\r\n";
serialPort.WriteLine(s);
rtb_log.AppendText(s);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
byte[] b = new byte[128];
serialPort.Read(b, 0, b.Length);
string s = Encoding.ASCII.GetString(b);
}
catch (Exception e3)
{
MessageBox.Show(e3.Message);
}
}
Пишу на C# программу, которая будет общаться с ком портом. Создал форму. Добавил в неё объект SerialPort. Программа открывает порт. Записывает в него данные. У порта есть событие DataReceived, которое как я понимаю наступает во время получения данных. Я хочу эти данные выводить на форму в RichTexBox (в коде rtb_log). Но в момент когда из порта должен прийти ответ возникает ошибка:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "rtb_log" не из того потока, в котором он был создан.
Насколько я понимаю, все элементы формы созданы в одном потоке, а чтение из порта это другой поток. И мне нужно из одного потока работать с элементом созданным в другом потоке.
Вы не могли бы мне как можно проще и нагляднее пояснить как можно решить данную проблему? На пальцах попытаться объяснить как в данном случае работать с потоками...
private void btn_open_port_Click(object sender, EventArgs e)
{
try
{
serialPort.PortName = "COM" + tb_com.Text;
serialPort.Open();
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
private void btn_write_Click(object sender, EventArgs e)
{
try
{
string s = tb_write.Text + "\r\n";
serialPort.WriteLine(s);
rtb_log.AppendText(s);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
byte[] b = new byte[128];
serialPort.Read(b, 0, b.Length);
string s = Encoding.ASCII.GetString(b);
}
catch (Exception e3)
{
MessageBox.Show(e3.Message);
}
}