|
|
|
tol05 |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 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 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
kihtov23 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 16.1.2014 Репутация: нет Всего: нет |
Я пытаюсь реализовать свой Invoke по аналогии как работает Control.Invoke().
tol05, вы занимались этим вопросом, может у вас есть своя реализация Invoke, был бы благодарен за примеры. Уже две из трех ссылок которые вы предлагали на английском не работают. Пробовал гуглить, нашел общие советы, но ничего конкретного. Помогите, пожалуйста, разобраться. |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |