Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
1

Обращение из потока к контролу

17.02.2016, 18:08. Показов 3438. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
Сегодня у меня печальный день((( Пол дня потратил чтобы решить проблему, так и не смог понять в чем дело. Вернее отдаленно в теории предположительно знаю в чем затык, но как его решить, не пойму.
Суть вот в чем.
Есть Form1
Есть модуль
Есть контрол расположенный на Form1

Что я пытался сделать.
Из Form1 вызываю процедуру, которая расположена в модуле. Процедура в модуле по задумке должна была обратится к контролу на Form1 и установить для контрола свойство visible.true

Код формы
VB.NET
1
2
3
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Progress()
End Sub
Код модуля
VB.NET
1
2
3
4
5
6
7
8
9
10
    Public Sub Progress()
        Dim thrd As Thread 
        thrd = New Thread(AddressOf runPr)
        thrd.Start()
    End Sub
 
    Public Sub runPr()
        'MsgBox("тест") 'месседж бокс срабатывает, т.е. программа до этого шага доходит
        Form1.PrBar.Visible = True 'тут ничего не происходит
    End Sub
Пробовал обратиться к форме через объект:
VB.NET
1
2
3
4
5
6
7
'Код из контрола
Dim Frm As Object = Form1
 
    Public Sub runPr()
        'MsgBox("тест")
        Frm.PrBar.Visible = True' исключение, что нет такого контрола
    End Sub
Тоже безрезультатно. Что не так не пойму.
Спасите, помогите! )))
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2016, 18:08
Ответы с готовыми решениями:

Обращение к контролу из потока
Помогите пожалуйста разобраться с обращением к контролам из потока. Приведенный под спойлером для...

Обращение к динамическому контролу
Здравствуйте. Как можно обратиться к динамическому контролу, например к TextBox из другого события....

Обращение к контролу из потока
Подскажите, как следует обращаться к контролу из другого потока? Например в этом случае: ...

Кросспоточное обращение к контролу
Есть листбокс в него добавляет запись метод, который вызывается в новом потоке. При попытке записи...

17
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
17.02.2016, 19:42 2
Лучший ответ Сообщение было отмечено edward_freedom как решение

Решение

Тут дело в том что в другом потоке немногого иначе представляется обращение к классам и объектам из основного потока, если мы пытаемся обратиться из соседних классов и модулей.

Для второстепенного потока так же доступен класс form1, но он не реализован для него, а вот что в основном потоке есть реализованный класс он игнорирует. Поэтому требуется уникальное имя объекта в основном потоке который невозможно создать как "new Form1"

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Module module1
 
    Public Frm As Form1
 
    Public Sub Progress()
        Frm = Form1
        Dim thrd As Thread
        thrd = New Thread(AddressOf runPr)
        thrd.Start()
    End Sub
 
    Public Sub runPr()
        'MsgBox("тест") 'месседж бокс срабатывает, т.е. программа до этого шага доходит
        'Form1.PrBar.Visible = True 'тут ничего не происходит
        Frm.Invoke(New _delegate(AddressOf ShowPrBar))
    End Sub
 
    Private Delegate Sub _delegate()
 
    Private Sub ShowPrBar()
        Frm.prbar.Visible = True
    End Sub
 
 
End Module
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
VB.NET
1
2
3
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown ' вместо Load
        Progress()
    End Sub
1
Эксперт .NET
10570 / 6494 / 1506
Регистрация: 25.05.2015
Сообщений: 19,668
Записей в блоге: 14
17.02.2016, 20:24 6
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Не в курсе как это исправить?
Этот замечательный метод, Invoke, вылетает с треском, если окно ещё не создано или уже удалено. Учитывайте это.
1
174 / 172 / 34
Регистрация: 23.12.2015
Сообщений: 300
Записей в блоге: 3
17.02.2016, 20:37 7
А можно же просто присваивать значение Public переменной типа Boolean в модуле. А потом в форме на основе этой переменной выполнять действия над контролами.
0
Эксперт .NET
10570 / 6494 / 1506
Регистрация: 25.05.2015
Сообщений: 19,668
Записей в блоге: 14
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
174 / 172 / 34
Регистрация: 23.12.2015
Сообщений: 300
Записей в блоге: 3
17.02.2016, 20:44 10
А городить тонны булевых флагов = говнокод.
Точно, лучше городить тонны объектов, и классов ;-)
1
Эксперт .NET
10570 / 6494 / 1506
Регистрация: 25.05.2015
Сообщений: 19,668
Записей в блоге: 14
17.02.2016, 20:50 11
Andrey PSt, они уже существуют и являются частью фреймворка. Но илитные говнокодеры конечно пишут свои велосипеды.

Добавлено через 2 минуты
Смысл их создания и применения есть в том, чтобы Вам же пришлось писать меньше кода. Когда кода меньше, меньше шанс наделать в нём ошибок.
0
174 / 172 / 34
Регистрация: 23.12.2015
Сообщений: 300
Записей в блоге: 3
17.02.2016, 20:56 12
То есть:
вот этого кода:
VB.NET
1
2
3
Public Frm As Form1
 Frm.Invoke(New _delegate(AddressOf ShowPrBar))
Private Delegate Sub _delegate()
МЕНЬШЕ ЧЕМ

VB.NET
1
2
3
4
Public Permission As Boolean
 
.....
Permission=True
1
Эксперт .NET
10570 / 6494 / 1506
Регистрация: 25.05.2015
Сообщений: 19,668
Записей в блоге: 14
17.02.2016, 20:59 13
Andrey PSt, ага, конечно.
А теперь сделайте, чтобы положение прогрессбара обновлялось, когда его надо обновить из потока.
Ну или, если у Вас тяга к булевым переменным, то как установить булевое свойство Checked у CheckBox'а из потока.
0
174 / 172 / 34
Регистрация: 23.12.2015
Сообщений: 300
Записей в блоге: 3
17.02.2016, 21:06 14
А зачем устанавливать свойство у CheckBox'а во время выполнения потоковой процедуры из модуля!??
Кому, где и когда это нужно. Максимум, где это применимо, так это изменения прогресБара.
Но такой задачи не было поставлено ТС.
0
Эксперт .NET
10570 / 6494 / 1506
Регистрация: 25.05.2015
Сообщений: 19,668
Записей в блоге: 14
17.02.2016, 21:12 15
Цитата Сообщение от Andrey PSt Посмотреть сообщение
Но такой задачи не было поставлено ТС.
Да ладно???
А это что тогда?
Процедура в модуле по задумке должна была обратится к контролу на Form1 и установить для контрола свойство visible.true
Цитата Сообщение от Andrey PSt Посмотреть сообщение
Кому, где и когда это нужно. Максимум, где это применимо, так это изменения прогресБара.
Это нужно очень-очень много где. А именно чекбокс - лишь пример, частный случай. Принципы одинаковы с любым контролом.
Так приведёте пример?

Добавлено через 4 минуты
Обращение к CheckBox.Checked и к Control.Visible одинаковое. Так что это имеет прямое отношение к вопросу ТС-а.
0
174 / 172 / 34
Регистрация: 23.12.2015
Сообщений: 300
Записей в блоге: 3
17.02.2016, 21:20 16
Процедура в модуле по задумке должна была обратится к контролу на Form1 и установить для контрола свойство visible.true
В примере ТС присвоение значения Control.Visible стоит в конце выполнения процедур Модуля. А не в цикле потока.
Вот я и предложил использовать флаг после выполнения Модульных процедур.
Согласен, мое решение - это частный случай и оно не решит задачу изменений контролов во время выполнения Модульных процедур.
0
Эксперт .NET
10570 / 6494 / 1506
Регистрация: 25.05.2015
Сообщений: 19,668
Записей в блоге: 14
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, можно попробовать так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Module Module1
    Private _main As SynchronizationContext
 
    Public Sub Progress()
        _main = SynchronizationContext.Current
        Dim thrd As Thread
        thrd = New Thread(AddressOf runPr)
        thrd.Start()
    End Sub
 
    Public Sub runPr()
        _main.Send(AddressOf ShowPrBar, True)
    End Sub
 
    Private Sub ShowPrBar(ByVal v As Boolean)
        Form1.PrBar.Visible = v
    End Sub
End Module
1
18.02.2016, 15:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2016, 15:43
Помогаю со студенческими работами здесь

Обращение к контролу из класса
Есть проект SL и на mainpage есть datagrid name="dg". Есть отдельно присоединенный класс. Как из...

Обращение к контролу по номеру
Есть 15 checkedListBox (либо comboBox). Как мне передать в какую нибуть функцию номер этого...

Достпуп к контролу с потока
Есть форма с ListBox. В форме описано: .... using Serv; using System.Threading; .... private...

обращение к контролу подчиненной формы
форумчане, как так? мне надо обратиться к контролу подчиненной формы....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru