395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
|
||||||||||||||||
1 | ||||||||||||||||
Обращение из потока к контролу17.02.2016, 18:08. Показов 3438. Ответов 17
Метки нет (Все метки)
Приветствую!
Сегодня у меня печальный день((( Пол дня потратил чтобы решить проблему, так и не смог понять в чем дело. Вернее отдаленно в теории предположительно знаю в чем затык, но как его решить, не пойму. Суть вот в чем. Есть Form1 Есть модуль Есть контрол расположенный на Form1 Что я пытался сделать. Из Form1 вызываю процедуру, которая расположена в модуле. Процедура в модуле по задумке должна была обратится к контролу на Form1 и установить для контрола свойство visible.true Код формы
Спасите, помогите! )))
0
|
17.02.2016, 18:08 | |
Ответы с готовыми решениями:
17
Обращение к контролу из потока Обращение к динамическому контролу Обращение к контролу из потока Кросспоточное обращение к контролу |
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
|
||||||
17.02.2016, 19:42 | 2 | |||||
Сообщение было отмечено edward_freedom как решение
Решение
Тут дело в том что в другом потоке немногого иначе представляется обращение к классам и объектам из основного потока, если мы пытаемся обратиться из соседних классов и модулей.
Для второстепенного потока так же доступен класс form1, но он не реализован для него, а вот что в основном потоке есть реализованный класс он игнорирует. Поэтому требуется уникальное имя объекта в основном потоке который невозможно создать как "new Form1"
4
|
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
|
|
17.02.2016, 20:04 [ТС] | 3 |
Sklifosofsky, не работает.
Вот такое исключение выскакивает: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна. Не в курсе как это исправить?
0
|
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
|
|
17.02.2016, 20:09 | 4 |
Что-то упустили
WindowsApplication61.rar
1
|
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
|
||||||
17.02.2016, 20:16 | 5 | |||||
1
|
17.02.2016, 20:39 | 8 |
Не по теме: А можно на ассемблере писать. :) Не атомарные значения нельзя просто взять и заменить, если к ним есть одновременный доступ из разных потоков. Элементы GUI как раз и относятся к запрещённым. А городить тонны булевых флагов = говнокод.
0
|
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
|
|
17.02.2016, 20:42 [ТС] | 9 |
Sklifosofsky, огромное спасибо, заработало.
Дело было не в form load, это я просто тут примитивный пример привел, чтобы проблема была не нагруженная левым кодом. А исключение вылетало из-за таба. У меня на форме таб и на табе прогрессбар. Я до открытия таба вызывал Progress() поэтому и вылезало исключение. Sklifosofsky,
0
|
17.02.2016, 20:50 | 11 |
Andrey PSt, они уже существуют и являются частью фреймворка. Но илитные говнокодеры конечно пишут свои велосипеды.
Добавлено через 2 минуты Смысл их создания и применения есть в том, чтобы Вам же пришлось писать меньше кода. Когда кода меньше, меньше шанс наделать в нём ошибок.
0
|
17.02.2016, 20:56 | 12 | ||||||||||
То есть:
вот этого кода:
1
|
17.02.2016, 20:59 | 13 |
Andrey PSt, ага, конечно.
А теперь сделайте, чтобы положение прогрессбара обновлялось, когда его надо обновить из потока. Ну или, если у Вас тяга к булевым переменным, то как установить булевое свойство Checked у CheckBox'а из потока.
0
|
17.02.2016, 21:06 | 14 |
А зачем устанавливать свойство у CheckBox'а во время выполнения потоковой процедуры из модуля!??
Кому, где и когда это нужно. Максимум, где это применимо, так это изменения прогресБара. Но такой задачи не было поставлено ТС.
0
|
17.02.2016, 21:12 | 15 |
Да ладно???
А это что тогда? Так приведёте пример? Добавлено через 4 минуты Обращение к CheckBox.Checked и к Control.Visible одинаковое. Так что это имеет прямое отношение к вопросу ТС-а.
0
|
17.02.2016, 21:20 | 16 |
Вот я и предложил использовать флаг после выполнения Модульных процедур. Согласен, мое решение - это частный случай и оно не решит задачу изменений контролов во время выполнения Модульных процедур.
0
|
17.02.2016, 21:24 | 17 |
В конце процедур модуля, выполняющихся в потоке. Т.е. Visible = true ставится из потока.
Добавлено через 1 минуту Перевод этого действия из отдельного потока в поток GUI как раз и обеспечивается синхронизацией через Invoke().
2
|
207 / 224 / 87
Регистрация: 21.04.2013
Сообщений: 404
|
||||||
18.02.2016, 15:43 | 18 | |||||
Кроме Invoke, можно попробовать так:
1
|
18.02.2016, 15:43 | |
18.02.2016, 15:43 | |
Помогаю со студенческими работами здесь
18
Обращение к контролу из класса Обращение к контролу по номеру Достпуп к контролу с потока обращение к контролу подчиненной формы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |