![]() |
|
![]() ![]() ![]() |
|
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Вам нужно в каждом thread'е, в котором вызывается Advise из вашего IConnectionPointContainer'а создавать невидимое окно с оконной функцией, которая в ответ на некоторое сообщение (например WM_USER) будет вызывать FireEvent. Handle'ы на все созданные окна нужно сложить в массив и рассылать по ним этот самый WN_USER на каждый callback. При shutdown'е всей этой бодяги надо не забыть разрушить все окна.
|
|||
|
||||
ivs4 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.7.2004 Репутация: нет Всего: нет |
Как я понимаю, Advise вызывается клиентской стороной для передачи своего интерфейса, через который в свою очередь вызывается ивент.
Вот, что я подумал. Что если в ф-ции SetCallBack производить следующтие действия. Создать новый поток, передать в этот поток указатель на CMyClass, в потоке работает цикл сообщений, при срабатывании CallBack посылаем в порожденный поток сообщение и в этом потоке вызывается Fire_CallbackDone. В данной схеме возможно еще понадобиться маршалинг. А вообще как можно отследить когда вызван advise, чтобы тогда создать этот поток не в SetCallBack а там. Это сообщение отредактировал(а) ivs4 - 7.7.2009, 09:16 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Вызывается Advise клиентской стороной но из вашего объекта (это метод интерфейса IConnectionPointContainer, который имплементирован в вашем классе)
Создание отдельного потока в CallBack у себя не поможет - при этом придется маршалить к себе в поток VBA'ный объект - приемник событий, а именно он после именно такого маршалинга и не работал ![]() И вообще, все методы всех интерфейсов вашего объекта будут вызываться в одном потоке (это обеспечивает COM, если вы конечно не поставили у вашего класса Neutral Threaded модель) Из этого же потока должны вызываться все event'ы (FireEvent). В этом же потоке VBS будет САМ крутить цикл обработки сообщений Это сообщение отредактировал(а) xvr - 7.7.2009, 09:24 |
|||
|
||||
ivs4 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.7.2004 Репутация: нет Всего: нет |
Тогда не понятно куда ставить цикл сообщений, если его надо ставить в поток где вызываются все методы интерфейсов. В методы его не поставишь. Где вызывается Advise, честно говоря, я не вижу.
Добавлено через 6 минут и 22 секунды Или же все тщетно - не вызвать из Callback событие? |
|||
|
||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Никуда его не надо ставить - он уже есть в VBA
Как то так:
![]() |
||||||||
|
|||||||||
ivs4 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.7.2004 Репутация: нет Всего: нет |
Попробовал вызов события через передачу сообщения в ф-цию окна. Теперь работает все без маршалинга и hres=0, но все равно, к сожалени ИВЕНТ не вызывется. Может что не то сделал?
|
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Вроде все правильно (не считая того, что класс окна нужно регистрировать только 1 раз).
А obj->Fire_CallBackDone вызывается? Может какие то несостыковки в Appartament моделях объекта и приложения? |
|||
|
||||
ivs4 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.7.2004 Репутация: нет Всего: нет |
Попробовал еще вот этот вариант:
http://support.microsoft.com/kb/196026/ все равно не вызывается событие. В Fire_CallBackDone
возвращает 0, но без события. Может что-то не то с этой библиотекой откуда вызывается CallBack? Хотя не должно. Сообщение доходит до обработчика и файр вызывается. |
|||
|
||||
ivs4 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.7.2004 Репутация: нет Всего: нет |
Удалось заставить заработать событие в VBA. Для этого в VBA в то место где ожидается срабатывание события добавил следующую ф-ция засыпания на 1 секунду.
Скорее всего сообщение ассоциированное с Invoke не обрабатвается. Конечно нет желания ставить такую обработку в клиентском коде. Как бы это обойти? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
А как VBA'ная прога ждет события? Если она в это время что то считает, то событие не будет принято - события принимаются только в Idle состоянии.
Можно заставить их принимать и не в Idle, но тогда надо явно крутить цикл обработки событий, что SleepVB и делает (в DoEvents) |
|||
|
||||
ivs4 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.7.2004 Репутация: нет Всего: нет |
А другого варианта как цикл DoEvents в VBA нет?
Я знаю, что майкрософтовский winsock сервер работает не так. Там событие прихода вызывается асинхронно. Это сообщение отредактировал(а) ivs4 - 13.7.2009, 21:51 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Есть. Написать нормальный обработчик в VBA. Точнее - обеспечить что бы VBA приложение работало так, как рассчитана модель событий VBA. Все события в VBA сериализуются, т.е. пока не закончится обработка одного, обработка другого не начнется (если не звать принудительно DoEvents)
![]() |
||||
|
|||||
ivs4 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.7.2004 Репутация: нет Всего: нет |
Спасибо за ответы. Полагаю тема исчерпана.
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |