![]() |
Работа с потоками. Чтение из COM-порта
Здравствуйте.
Пишу на C# программу, которая будет общаться с ком портом. Создал форму. Добавил в неё объект SerialPort. Программа открывает порт. Записывает в него данные. У порта есть событие DataReceived, которое как я понимаю наступает во время получения данных. Я хочу эти данные выводить на форму в RichTexBox (в коде rtb_log). Но в момент когда из порта должен прийти ответ возникает ошибка: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "rtb_log" не из того потока, в котором он был создан. Насколько я понимаю, все элементы формы созданы в одном потоке, а чтение из порта это другой поток. И мне нужно из одного потока работать с элементом созданным в другом потоке. Вы не могли бы мне как можно проще и нагляднее пояснить как можно решить данную проблему? На пальцах попытаться объяснить как в данном случае работать с потоками... Код:
private void btn_open_port_Click(object sender, EventArgs e) |
|
Tonny_Bennet, эта проблема была недавно описана в этом форуме. http://forum.oszone.net/thread-227336.html
|
ferget, начал вчитываться... мне всё так же не понятна логика работы... пока не пойму логику не пойму что с чем завязать.
Поправьте меня если я не прав: Сначала я записываю в порт массив из байт. Затем обработчик событий serialPort_DataReceived срабатывает при приходе сообщения с порта. В теле обработчика я запускаю чтение того количества элементов массива, которые есть в буфере приёма serialPort.BytesToRead. Но когда в этом же обработчике я пытаюсь записать считанные байты в элемент формы мне вылетает ошибка: попытка доступа к элементу управления "rtb_log" не из того потока, в котором он был создан. Может мне нужно после прочтения сообщения создать событие: "Сообщение прочитано: текст сообщения" А для rtb_log сделать обработчик событий который будет ловить эти сообщение и выписывать в форму? Расскажите пожалуйста как это сделать правильно.... P.S. Язык MSDN не всегда понятен В примере Код:
|
Tonny_Bennet, я же тебе написал решение проблемы. Там даже код есть. Внедряешь его себе и пишешь спокойно дальше многопоточный код. Ну или идешь кривым путем и перед вызовом вывода сообщений пишешь
Код:
Control.CheckForIllegalCrossThreadCalls = false; |
Время: 05:12. |
Время: 05:12.
© OSzone.net 2001-