Re[3]: События из worker thread
От: Tom Россия http://www.RSDN.ru
Дата: 26.07.02 09:21
Оценка:
bnk>Многоуважаемый Tom, я думаю, что знаю, что такое ConnectionPoint, и с чем ее едят. В письме я подразумевал под 'зажечь event' именно вызов через ConnectionPoint. Я понимаю, что можно зажечь event из второй thread, и знаю, как отмаршалить InterfacePointer для этого. Проблема в том, что Зажигать Event из этой thread нельзя, т.к., повторяю, этот thread Не должен тормозиться, а именно это и произойдет, если сделать вызов на ConnectionPoint оттуда.

В таком случае многоуважаемый bnk вы должны не извращаться, а писать свой маршалер. Хотя...
Народная мудрось
всем все никому ничего(с).
Re[10]: События из worker thread
От: bnk СССР http://unmanagedvisio.com/
Дата: 26.07.02 09:21
Оценка:
Здравствуйте Ivan, Вы писали:

I>Советую не обращать внимания на эту странность IDE


Я бы наплевал на IDE, но объект-то используется из Access (VBA). А там то же самое, что и с IDE.
Re[10]: А модель какая?
От: bnk СССР http://unmanagedvisio.com/
Дата: 26.07.02 09:44
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте bnk, Вы писали:


Vi2>Тогда может посмотришь статью Понимание подразделений COM
Автор(ы): Jeff Prosise
Дата: 22.02.2001

В этой статье подробно рассматриваются подразделения (apartments) в модели
COM. Автор описывает различные виды подразделений, показывает, каким образом
подразделения назначаются потокам и объектам, а также даёт ряд полезных
советов, которые позволят вам избежать ошибок при работе с подразделениями.
?


Спасибо, Vi2, у меня к вам вот какой вопрос: Т.к. Мой компонент в STA, то, кажется, вызов на ConnectionPoint должен его блокировать, пока он не отработает. Однако, он диспатчит WM_MY, пока отрабатывает ConnectionPoint. В этом и проблема, я думаю. Вопрос: Можно как-нибудь запретить диспатч WM_MY, пока отрабатывает вызов ? Это бы сразу все решило.
Re[11]: А модель какая?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 09:46
Оценка:
Здравствуйте bnk, Вы писали:

bnk>Спасибо, Vi2, у меня к вам вот какой вопрос: Т.к. Мой компонент в STA, то, кажется, вызов на ConnectionPoint должен его блокировать, пока он не отработает. Однако, он диспатчит WM_MY, пока отрабатывает ConnectionPoint. В этом и проблема, я думаю. Вопрос: Можно как-нибудь запретить диспатч WM_MY, пока отрабатывает вызов ? Это бы сразу все решило.


Я с окнами не в ладах. Может быть Ivan сможет ответить?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[11]: События из worker thread
От: Ivan Россия www.rsdn.ru
Дата: 26.07.02 10:07
Оценка:
Здравствуйте bnk, Вы писали:

bnk>Здравствуйте Ivan, Вы писали:


I>>Советую не обращать внимания на эту странность IDE


bnk>Я бы наплевал на IDE, но объект-то используется из Access (VBA). А там то же самое, что и с IDE.


Может имеет смысл попробовать вместо MessageBox использовать модальный диалог (как описывается в Q178078 ) ? События то глотаются только для MessageBox'а
Re[12]: События из worker thread
От: Николай Белых СССР http://unmanagedvisio.com/
Дата: 26.07.02 10:30
Оценка:
Здравствуйте Ivan, Вы писали:

I>Может имеет смысл попробовать вместо MessageBox использовать модальный диалог (как описывается в Q178078 ) ? События то глотаются только для MessageBox'а


Чертов MsgBox, чтоб его раскорячило

Кстати, я спрашивал у Vi2, он предложил у вас спросить, цитирую:
bnk>Спасибо, Vi2, у меня к вам вот какой вопрос: Т.к. Мой компонент в STA, то, кажется, вызов на ConnectionPoint должен его блокировать, пока он не отработает. Однако, он диспатчит WM_MY, пока отрабатывает ConnectionPoint. В этом и проблема, я думаю. Вопрос: Можно как-нибудь запретить диспатч WM_MY, пока отрабатывает вызов ? Это бы сразу все решило.

Vi2> Я с окнами не в ладах. Может быть Ivan сможет ответить?
Re[4]: События из worker thread
От: Николай Белых СССР http://unmanagedvisio.com/
Дата: 26.07.02 10:44
Оценка:
Здравствуйте Tom, Вы писали:

Tom>В таком случае многоуважаемый bnk вы должны не извращаться,


Tom, что имеется в виду под 'извращаться' — то что я делаю, неверно в принципе? Ситуация следующая: этот самый объект завязан на COM-порт(разбирает приходящие данные), и хочется периодически получать от него event-ы по поводу прибытия определенных данных, но чтобы сам он по-прежнему занимался портом.
Tom> а писать свой маршалер.
'писать свой маршалер' — что вы имеете в виду ?
Re[13]: События из worker thread
От: Ivan Россия www.rsdn.ru
Дата: 26.07.02 10:49
Оценка:
Здравствуйте Николай Белых, Вы писали:

НБ>Здравствуйте Ivan, Вы писали:


НБ>Кстати, я спрашивал у Vi2, он предложил у вас спросить, цитирую:

bnk>>Спасибо, Vi2, у меня к вам вот какой вопрос: Т.к. Мой компонент в STA, то, кажется, вызов на ConnectionPoint должен его блокировать, пока он не отработает. Однако, он диспатчит WM_MY, пока отрабатывает ConnectionPoint. В этом и проблема, я думаю. Вопрос: Можно как-нибудь запретить диспатч WM_MY, пока отрабатывает вызов ? Это бы сразу все решило.

Можно попробовать вместо оконных сообщений использовать еще 1 доп. поток, который будет посылать сообщения клиенту. С потоком общаться с помощью PostThreadMessage. Этот "поток для событий" попробовать поместить в MTA
Re[13]: События из worker thread
От: Ivan Россия www.rsdn.ru
Дата: 26.07.02 11:33
Оценка:
Здравствуйте Николай Белых, Вы писали:


НБ>Кстати, я спрашивал у Vi2, он предложил у вас спросить, цитирую:

bnk>>Спасибо, Vi2, у меня к вам вот какой вопрос: Т.к. Мой компонент в STA, то, кажется, вызов на ConnectionPoint должен его блокировать, пока он не отработает. Однако, он диспатчит WM_MY, пока отрабатывает ConnectionPoint. В этом и проблема, я думаю. Вопрос: Можно как-нибудь запретить диспатч WM_MY, пока отрабатывает вызов ? Это бы сразу все решило.

Я думаю,проблема все-таки у VB, а управление он просто сразу возвращает, поэтому узнать, когда закончился обработчик событий у VB не получится. ИМХО самое простое решение — использовать модальный диалог "замасированный" под MessageBox
Re[5]: События из worker thread
От: Tom Россия http://www.RSDN.ru
Дата: 26.07.02 14:18
Оценка: 10 (2)
НБ>Tom, что имеется в виду под 'извращаться' — то что я делаю, неверно в принципе?
Абсолютно правильно. То, как вы пытаетесь решить проблемму, это ,если более мягко, абсолютно не по комовски. Правильное решение — это организовать обмен при помощи IStream (именно так делает урловый моникёр, а задача у него такая же — читать данные из сети и иногда извещать об этом эксплорер) который либо прежде надо реализовать (тут можно предусмотреть различные вырианты кэширования), либо (если лень) используйте реализацию на файл (вариантов миллион). Основная идея такая: В ваш поток передаётся IStream (благо про маршалинг вы уже знаете), который туда пишет (и никаких блокировок, а если ещё и самому IStream написать на память например, которую иногда можно скидывать в файл если читающий запаздывает, что то меня в сторону виртуальной памяти понесло...). Далее тот, кому надо читать из него спокойно читает. Итд... Тут я думаю всё понятно.

НБ>'писать свой маршалер' — что вы имеете в виду ?

То и имею. Кидать события через ConnectionPoint, но использовать ручной маршалинг для событийного интерфейса, а там опять же вариантов много.

Выбирать вам, так как любое (даже не очень красивое) решение можно довести до работающего варианта, вот только потом, когда скажут: "А напиши ты нам ещё..." часто приходится переписывать заново.
Народная мудрось
всем все никому ничего(с).
Re[6]: События из worker thread
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 15:15
Оценка: 9 (1)
Здравствуйте Tom, Вы писали:

Tom>То и имею. Кидать события через ConnectionPoint, но использовать ручной маршалинг для событийного интерфейса, а там опять же вариантов много.


ИМХО, жирно будет — использовать для этого дела ручной маршалинг, как это определает статья Секреты маршалинга
Автор(ы): Чистяков В.Ю.
, т.е. через свою реализацию IMarshal и т.п.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: События из worker thread
От: Максим Алексейкин Россия  
Дата: 26.07.02 17:17
Оценка:
Здравствуйте Tom, Вы писали:

НБ>>Tom, что имеется в виду под 'извращаться' — то что я делаю, неверно в принципе?

Tom>Абсолютно правильно. То, как вы пытаетесь решить проблемму, это ,если более мягко, абсолютно не по комовски. Правильное решение — это организовать обмен при помощи IStream (именно так делает урловый моникёр, а задача у него такая же — читать данные из сети и иногда извещать об этом эксплорер) который либо прежде надо реализовать (тут можно предусмотреть различные вырианты кэширования), либо (если лень) используйте реализацию на файл (вариантов миллион). Основная идея такая: В ваш поток передаётся IStream (благо про маршалинг вы уже знаете), который туда пишет (и никаких блокировок, а если ещё и самому IStream написать на память например, которую иногда можно скидывать в файл если читающий запаздывает, что то меня в сторону виртуальной памяти понесло...). Далее тот, кому надо читать из него спокойно читает. Итд... Тут я думаю всё понятно.
НБ>>'писать свой маршалер' — что вы имеете в виду ?
Tom>То и имею. Кидать события через ConnectionPoint, но использовать ручной маршалинг для событийного интерфейса, а там опять же вариантов много.
Tom>Выбирать вам, так как любое (даже не очень красивое) решение можно довести до работающего варианта, вот только потом, когда скажут: "А напиши ты нам ещё..." часто приходится переписывать заново.

Что-то я не улавливаю смысла в этой рекомендации Задача то стоит в том чтобы евенты обрабатывались асинхронно от работы потока, который читает из порта. А тут получается так: поток пишет в стрим, потом через механизм ConnectionPoint рожает евент, обработчик евента читает из стрима, А ПОТОК ТО ВИСИТ. Где асинхронность?
ICQ #311116826
Re[7]: События из worker thread
От: Tom Россия http://www.RSDN.ru
Дата: 26.07.02 17:29
Оценка:
МА>Что-то я не улавливаю смысла в этой рекомендации Задача то стоит в том чтобы евенты обрабатывались асинхронно от работы потока, который читает из порта. А тут получается так: поток пишет в стрим, потом через механизм ConnectionPoint рожает евент, обработчик евента читает из стрима, А ПОТОК ТО ВИСИТ. Где асинхронность?

Для тех, кто не улавливает:
Было описано 2 РАЗНЫХ способа решения задачи. В 1 события вообще не использовались, во втором использовались. Надеюсь теперь понятно
Народная мудрось
всем все никому ничего(с).
Re[7]: События из worker thread
От: Tom Россия http://www.RSDN.ru
Дата: 26.07.02 17:37
Оценка:
Vi2>ИМХО, жирно будет — использовать для этого дела ручной маршалинг, как это определает статья Секреты маршалинга
Автор(ы): Чистяков В.Ю.
, т.е. через свою реализацию IMarshal и т.п.


Может и жирновато, но:
1. Это правильно
2. Хороший способ разобраться с ручным маршалингом, так как всё равно когдан нибудь придётся.

Подсчитаем за и против
Против:
1. Лень разбираться
2. Больше времени для первой версии
За:
1. Решение проблеммы профессиональным способом
2. Довольно простой support проекта в будущем
3. Овладение очень полезной технологией
Народная мудрось
всем все никому ничего(с).
Re[6]: События из worker thread
От: bnk СССР http://unmanagedvisio.com/
Дата: 26.07.02 17:54
Оценка:
Здравствуйте Tom, Вы писали:

Насчет IStream — Все так, но как же сообщить 'тому, кому надо читать', что пора это делать? — сам-то он ведь не догадается, т.е. кажется, это та же самая проблема.

А насчет ручного маршалинга — что-то это кажется слишком тяжеловесно для такой, кажется, простой задачи...
Re[7]: События из worker thread
От: Tom Россия http://www.RSDN.ru
Дата: 26.07.02 18:04
Оценка:
bnk>Насчет IStream — Все так, но как же сообщить 'тому, кому надо читать', что пора это делать? — сам-то он ведь не догадается, т.е. кажется, это та же самая проблема.

Эта уже проблемма синхронизации, а не пропадания сообщений. А решить красиво её можно в реализации IStream. А почему вообще по таймеру не читать ?
Народная мудрось
всем все никому ничего(с).
Re[5]: События из worker thread
От: George_Seryakov Россия  
Дата: 27.07.02 23:22
Оценка:
Здравствуйте bnk, Вы писали:

GS>>Поставь критсекцию на вызов Fire_MY():

bnk>Спасибо за совет, но это не проходит, т.к. ниточка, входящая в обработчик WM_MY, одна и та же при первом и при втором вхождении . Так что при попытке войти в CS во второй раз все просто повисает.

Сильно. А как ты посылаешь сообщение WM_MY? SendMessage? Попробуй PostMessage.
GS
Re[8]: События из worker thread
От: Victor387 Россия  
Дата: 29.07.02 08:54
Оценка:
Здравствуйте Tom, Вы писали:
Tom>Эта уже проблемма синхронизации, а не пропадания сообщений. А решить красиво её можно в реализации IStream. А почему вообще по таймеру не читать ?
[b]Можно читать и по таймеру[b].
Но тогда это получается уже поллинг (периодический опрос состояния) COM-порта (serial port)
Тогда зачем COM/ActiveX/компонентная технология?
Пишется простенькая dll или встраиваются ф-ции работы с портом в приложение VB и приложение занимается поллингом по таймеру какого-либо устройства/каких-либо устройств. [b](события не используются)[b]
Проблема в том, что тогда приложение занимается тем, что обслуживает порт, тайм-ауты на порт и т.д. А во время очередного опроса пользователь ждет пока он завершится, либо если произошел сбой связи, тайм-аут порта, и чем больше это время, тем больше пользователь ждет.
Автору темы нужны именно события, т.к. тогда приложение отдает все что связано со связью и портом компоненту. Приложение запускает устройство, устройство информирует приложение, поэтому события не должны теряться, и должны обрабатываться в последовательности поступления.
ИМХО: Это я так понял из дискуссии.
Требовалось решить проблему сохранения и генерации события (ий), возникшего во время обработки первого (N-го). Как же решают ее IStream ? Вы бы код привели ?
А вообще хорошая дискуссия!
Виктор
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.