Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работает Invoke()? 
V
    Опции темы
tol05
Дата 21.5.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: нет
Всего: 170



Привет всем. У меня возник вопрос - а как вообще устроен метод Invoke()?
Я сижу на C#. В .Net он используется в нескольких случаях. Но меня сейчас интересует только один: метод Invoke() позволяет вызвать метод класса (указатель на ф-цию передается ему как параметр) из другого потока.

Т.е. создана windows-форма в основном потоке (main) , по какому-нибудь событию я начинаю длительную вычислительную операцию и для нее создаю отдельный поток thread1.  Так вот, в thread1 вычисления закончились и я должен обновить контрол на форме. Но т.к. форма создана в потоке main, то для вызова метода обновления (form1->UpdateControl(), например) я из thread1 должен использовать MyControl->Invoke(...), и передать ему указатель на UpdateControl() как параметр.

Как Invoke() из потока thread1 заставит поток main прервать свои действия и вызвать form1->UpdateControl()?

Я знаю, что эта балалайка идет еще от COM, да вот беда, COM я не учил. 

Просьба: ответьте плиз, реально нужно. Если можно - в простой, наглядной форме. Можно без особых подробностей.
____________________________________________________________________________________________________________________
Разобрался сам  с помощью гугла и рефлектора.

если кому интересно, 
все на английском:
http://weblogs.asp.net/justin_rogers/articles/126345.aspx
http://discuss.develop.com/archives/wa.exe...tnet&P=2526
http://infosysblogs.com/microsoft/2006/10/...rol_access.html
на русском:
http://www.gotdotnet.ru/Forums/Common/219427.aspx?page=4

Ну а на словах: 

Внутри Invoke вызывается MarshaledInvoke(Control caller, Delegate method, object[] args, bool synchronous).
Там проверяется, является ли поток контрола (мы ведь Control.Invoke() вызываем, так что он с помощью двух хитрых API функций GetWindowThreadProcessId() и GetCurrentThreadId() узнает идентификатор потока контрола) потоком текущим (его мы тоже всегда знаем)
Если да, то сразу обработчик вызываем. Если нет - функция PostMessage (API) посылает сообщение в очередь сообщений связанных с потоком контрола. 
Т.о. работа будет осуществляться по принципу, похожему на принцип передатчика/приемника события (или сообщения, кому как нравится).
MarshaledInvoke() вызывается как в случае Invoke(), так и в случае BeginInvoke() - отличия - в значении флага synchronous
Если асинхронно - не ждем выполнения и из MarshaledInvoke выходим. Если синхронно - ждем внутри MarshaledInvoke окончания.

Это сообщение отредактировал(а) tol05 - 21.5.2007, 17:57


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
kihtov23
Дата 16.1.2014, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.1.2014

Репутация: нет
Всего: нет



Я пытаюсь реализовать свой Invoke по аналогии как работает Control.Invoke().
tol05, вы занимались этим вопросом, может у вас есть своя реализация Invoke, был бы благодарен за примеры.
Уже две из трех ссылок которые вы предлагали на английском не работают. Пробовал гуглить, нашел общие советы, но ничего конкретного. Помогите, пожалуйста, разобраться.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1201 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.