| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Доступ к контролам в другом потоке |
| Автор: ДобренькийПапаша 18.3.2010, 10:55 |
| Так получилось, что с многопоточностью работать не приходилось. В одном классе есть две функции. Из одной происходит вызов второй, в которой надо открыть поток и получать доступ к нескольким элементам управления. А то я получаю исключение всё время, мол "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'такому-то' не из того потока, в котором он был создан." Я быстро пролистал тему многопоточности, потыкался, но что-то пока не получается. А мне надо срочно решить эту проблему. |
| Автор: Voyager 18.3.2010, 11:04 |
| Control.InvokeRequired http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx |
| Автор: A5uKa 18.3.2010, 11:10 | ||
... ? п.с. но его Invoke лучше ) |
| Автор: ДобренькийПапаша 18.3.2010, 12:19 | ||
Спасибо. Но до меня никак не допрёт...
Я не пойму как использовать тут InvokeRequired, а затем Invoke() с делегатом, в который надо засунуть метод и из него вернуть каким-то образом значение текстбокса, чтобы присвоить его переменной term. Как это сделать с BackgroundWorker тоже не пойму))) Я чисто не могу представить себе конструкцию. |
| Автор: KelTron 18.3.2010, 13:04 | ||
Что то типа:
|
| Автор: Rohoss 18.3.2010, 20:51 |
| ДобренькийПапаша, простите, но я чего то не понимаю... Насколько я знаю, контроллы должны быть в основном потоке. Если это так, то с доступом к контроллу не должно быть особых проблем. Не опйму, зачем в таком случаи импортировать "user32.dll"? Хотя, если это WPF, то там решается немножко по другому. А если у вас контроллы в разных потоках (это вообще возможно?), то у вас как минимум ошибка в проектировании. |
| Автор: ДобренькийПапаша 27.4.2010, 15:37 | ||||||
Снова открою тему, так получилось, что мне пришлось запускать метод асинхронно:
До этого я метод ParseFileToLineChart() запускал синхронно с помощью класса Thread, тогда внутри метода конструкция
работала нормально. А теперь выполнение на этом месте "застревает". Заменил Invoke(...) на BeginInvok():
так работает нормально. Объясните почему так происходит? Типа если там асинхронный вызов, то и внутри тоже надо асинхронно? |
| Автор: ДобренькийПапаша 27.4.2010, 18:36 |
| Таки нет. Неприятности остаются. В потоке, который запускаю через делегат, присутствуют несколько BeginInvoke() (в блоках InvokeRequired). Из-за особенностей асинхронного исполнения (как я понял), у меня в неправильной последовательности (для меня неправильной\некорректной с точки зрения логики) выполняются инструкции. Можно ли как-то управлять этим процессом? То есть завершить определённые действия в блоке InvokeRequired, чтобы выполнение шло дальше только после выполнения инструкций в блоке InvokeRequired. |