Как работать с NumericUpDown из другого потока?
Помогите, пожалуйста, со следующей ситуацией.
Я использую компонент SerialPort, который генерирует событие DataReceived в отдельном потоке. Мне нужно в этом событии обратится к свойству компонента NumericUpDown->Value, например
NumericUpDown->Value = 10;
Но при попытке выполнить данную строку кода компилятор выдаёт ошибку:
"Additional information: Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on."
Я так понимаю, что надо использовать возможности компонента System::Threading для правильного обращения к свойствам потоконебезопасного компонента NumericUpDown.
Можете привести пример корректного обращения к NumericUpDown->Value из другого (неосновного) потока?
смотрите в сторону Invoke
Спасибо!
Если я ничего не путаю, то все WinForms компоненты дотнета, как ты сказал являются потоконебезопасными, т.е. из другого потока их дергать нельзя. Нужно создать какой-то разделяемый потоками ресурс - переменную, файл или класс. Из одного потока писать туда, из другого читать. Ну синхронизацию на доступ к ресурсу добавить.
Спасибо, мне уже подсказали на
Цитата: Inc(Dec(i))
Если я ничего не путаю, то все WinForms компоненты дотнета, как ты сказал являются потоконебезопасными,
Как раз наоборот. Они потокобезопасные, так как контролируют доступ к своим свойствам, и в определенных случаях требуют явную синхронизацию посредством вызова Invoke (BeginInvoke/EndInvoke).
Цитата: dmitry1208197320
Спасибо, мне уже подсказали на http://forum.sysman.ru/index.php?showtopic=25199&st=0&#entry221351
Очередной довод в пользу того, что нельзя использовать MC++ для написания WinForms-приложения. Впрочим это уже оффтоп.