Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как работать с NumericUpDown из другого потока?

48K
02 февраля 2010 года
dmitry1208197320
10 / / 02.10.2009
С++.
Помогите, пожалуйста, со следующей ситуацией.
Я использую компонент 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 из другого (неосновного) потока?
257
02 февраля 2010 года
kosfiz
1.6K / / 18.09.2005
смотрите в сторону Invoke
48K
02 февраля 2010 года
dmitry1208197320
10 / / 02.10.2009
Спасибо!
23K
03 февраля 2010 года
Inc(Dec(i))
61 / / 13.02.2009
Если я ничего не путаю, то все WinForms компоненты дотнета, как ты сказал являются потоконебезопасными, т.е. из другого потока их дергать нельзя. Нужно создать какой-то разделяемый потоками ресурс - переменную, файл или класс. Из одного потока писать туда, из другого читать. Ну синхронизацию на доступ к ресурсу добавить.
48K
04 февраля 2010 года
dmitry1208197320
10 / / 02.10.2009
Спасибо, мне уже подсказали на http://forum.sysman.ru/index.php?showtopic=25199&st=0&#entry221351
5
04 февраля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Inc(Dec(i))
Если я ничего не путаю, то все WinForms компоненты дотнета, как ты сказал являются потоконебезопасными,

Как раз наоборот. Они потокобезопасные, так как контролируют доступ к своим свойствам, и в определенных случаях требуют явную синхронизацию посредством вызова Invoke (BeginInvoke/EndInvoke).

5
04 февраля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: dmitry1208197320
Спасибо, мне уже подсказали на http://forum.sysman.ru/index.php?showtopic=25199&st=0&#entry221351


Очередной довод в пользу того, что нельзя использовать MC++ для написания WinForms-приложения. Впрочим это уже оффтоп.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог