Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > .NET для новичков > Использование метода Invoke |
Автор: RUVATA 22.2.2011, 13:48 | ||||
Всем доброго времени суток... В процессе освоения платформы плавно перешел к программированию многопоточного приложения, благо Vb.NET теперь это умеет среда Visual Studio 2010 Доступный пример нашел http://www.realcoding.net/article/view/2752 но он не отрабатывает,
на выходе имею ошибку а именно
не обрабатывается по причине "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Label1' не из того потока, в котором он был создан." Надо мол использовать Invoke А ВОТ КАК ? Я наскоком на справку понять не смог... прошу помощи коллективного разума Можно мне подсказать как на этом примере использовать эту безопасную многопоточность. |
Автор: -Mikle- 22.2.2011, 17:39 | ||
Код внутри бресетов выполнится в основном потоке приложения. Имейте ввиду, что пока выполняется метод Invoke, ваш поток будет ждать отработки. Если вы не желаете, чтоб ваш поток ждал выполнения кода для окна, то используйте метод BeginInvoke. Добавлено через 4 минуты и 39 секунд Этот метод находится в классе Control, а это значит, что вы одинаково смело можете его вызывать у любого элемента окна. |
Автор: RUVATA 24.2.2011, 09:13 |
Все равно, не понял... Я уже какие только примеры не пробовал, они даже синтаксическую проверку не проходят... Можно попросить вас описать конструкцию, принципал... Вот допустим есть основной поток "Основной" в котором описана форма, с элементом управления "Кнопка" Есть дополнительный поток "ВторПоток" Я хочу из "ВторПоток" изменять некое свойство объекта "Кнопка" Такое действие само по себе не является потокобезопасным (бред Microsoft) (в Swing Java такого геморроя нет, чтобы избежать взаимоблокировки или гонки там используются конструкции очереди потипо Try Cath с условием) и дабы разрешить возможные конфликты совместного доступа, предлагается на выбор: или сконструировать "ВторПоток" изначально специфическим BackgroundWorker , я еще не пробовал... или использовать специальный метод вхождения в основной поток Invoke... Но его суть я так и "нераскурил", какой делегат, кто он ![]() Пример из справки просто тащит, т.к. он сам на этом-же исключении тормозит ![]() |
Автор: RUVATA 24.2.2011, 10:24 | ||||
Ну так и я так думал до определенной сотой попытки подпихнуть что ни будь типа
ну так нет-же в аргумент нужен объект типа System.Delegate справка описывает его так "Представляет делегат — структуру данных, указывающую на статический метод или на экземпляр класса и метод экземпляра этого класса." Ну во первых меня сильно долбит изобилие термина МЕТОД... мне-то нужно обратиться к СВОЙСТВУ... но не суть... мне-бы банальный пример... КАК ОБРАТИТЬСЯ ЧЕРЕЗ Invoke К СВОЙСТВУ ЭЛЕМЕНТА UI-ПОТОКА Label1.Text ИЗ ДОЧЕРНЕГО ПОТОКА |
Автор: diadiavova 24.2.2011, 10:51 | ||||||||
Методу Invoke надо в качестве аргумента передать метод. Если тебе нужно обратиться к свойству, то сделать это можно в передаваемом методе. То есть ты либо определяешь этот метод отдельно и передаешь на него ссылку
После чего делаешь так
Либо определяешь метод прямо в коде вызова
|
Автор: RUVATA 24.2.2011, 11:04 |
diadiavova, Огромное спасибо, выручаешь уже не первый раз... Я вот только сейчас "прозрел" на счет того что имеется в виду как МЕТОД... Может я и не прав, но по моему это наводит путаницу... потому что это не МЕТОД (чей-же это метод UI-потока что ли? где базовый объект) в понимании ООП... это не что иное как ПРОЦЕДУРА вернее её экземпляр, причем мне не понятно зачем этот наворот, неужели абстрактный Sub () нельзя было включить в сам Invoke, а для извращений сделать отдельную перегрузку и передавать собственно само обращение... Просто лично меня МЕТОД вывел из рановесия... что за метод, чей, причем здесь метод вашпе... еще раз спасибо... |
Автор: diadiavova 24.2.2011, 11:18 | ||||
Сейчас в основных языках платформы очень много наворотов из ФЯ и их становится все больше. Не вижу в этом проблемы, по-моему это благо. Что касается терминологии, то она оопэшная только и всего. Работа с делегатами только поначалу кажется сложной, со временем разберешься и станет трудно без них обходиться. ![]()
Попробуй сам реализовать это с помощью метода расширения, тогда поймешь, в чем проблема, так трудно объяснить, да и в методе может быть гораздо больше одной строчки кода. |