C++ DLL callback for VB
От: cozy Украина  
Дата: 07.01.10 16:54
Оценка:
Привет,

У меня есть задача — сделать С++ DLL, фукнции которой будут дергаться из VB. Вопрос том как организовать асинхронность вызова, чтобы не блокировать VB приложение на время выполнения C++ функции. Простейшее решение — сделать две функции, одна запускает операцию, другая возвращает результат — но это как-то не очень красиво.

Может у кого-нибудь есть идеи, как можно сделать callback в этой ситуации?

Спасибо

15.01.10 12:41: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: C++ DLL callback for VB
От: cozy Украина  
Дата: 07.01.10 17:10
Оценка:
Я нашел решение, может кому пригодится:

В VB есть оператор AddressOf, с поомщью которого можно передать адрес VB-шной функции как колбека. Подробности тут: http://support.microsoft.com/kb/181578
Re[2]: C++ DLL callback for VB
От: Кодт Россия  
Дата: 07.01.10 18:06
Оценка:
Здравствуйте, cozy, Вы писали:

C>Я нашел решение, может кому пригодится:


C>В VB есть оператор AddressOf, с поомщью которого можно передать адрес VB-шной функции как колбека. Подробности тут: http://support.microsoft.com/kb/181578


А как у васика дела с многопоточностью?
Ведь, если функция выполняется асинхронно, это значит — в другом потоке. И колбек тоже вызовет в этом другом потоке.

Может быть, удобнее будет послать какое-то сообщение какому-то окошку, а уже в окошке обработать как следует.
Впрочем, этим может озаботиться непосредственно колбек.
Перекуём баги на фичи!
Re[3]: C++ DLL callback for VB
От: cozy Украина  
Дата: 07.01.10 19:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А как у васика дела с многопоточностью?

К>Ведь, если функция выполняется асинхронно, это значит — в другом потоке. И колбек тоже вызовет в этом другом потоке.

К>Может быть, удобнее будет послать какое-то сообщение какому-то окошку, а уже в окошке обработать как следует.

К>Впрочем, этим может озаботиться непосредственно колбек.

Не уверен на счет многопоточности в VB — может оно там под капотом само снихронизирует доступ. Но думаю месседж — то, что надо.
Re[4]: C++ DLL callback for VB
От: MasterZiv СССР  
Дата: 11.01.10 10:45
Оценка:
cozy wrote:

> Не уверен на счет многопоточности в VB — может оно там под капотом само

> снихронизирует доступ. Но думаю месседж — то, что надо.

Синхронизация есть только при доступе к методам COM-объекта.
Я бы рекомендовал написать в таком случае COM-объект (Active-X).
Там уже есть модели многопоточности, и, на сколько я понимаю,
VB сможет как минимум правильно работать с асинхронно работающим
объектом.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: C++ DLL callback for VB
От: cozy Украина  
Дата: 12.01.10 13:28
Оценка:
Здравствуйте, MasterZiv, Вы писали:

На самом деле, текст статика на формочке отлично меняется из коллбека безо всяких проблем, а по условию задачи ничего больше и не надо было. Так что обошелся даже без сообщения окну
Re[6]: C++ DLL callback for VB
От: Кодт Россия  
Дата: 15.01.10 09:41
Оценка:
Здравствуйте, cozy, Вы писали:

C>На самом деле, текст статика на формочке отлично меняется из коллбека безо всяких проблем, а по условию задачи ничего больше и не надо было. Так что обошелся даже без сообщения окну


На самом деле, там как раз синхронные сообщения летают (статик и формочка — это ведь тоже окна).

— рабочий поток синхронно (SendMessage) посылает WM_SETTEXT окну... кладёт его в очередь оконного потока, и засыпает
— оконный поток в главном или модальном цикле обработки сообщений
— — вынимает сообщение из очереди (PeekMessage / GetMessage),
— — вызывает (DispatchMessage) обработчик соответствующего окна — статика на формочке
— — дожидается его исполнения
— — пересылает результат рабочему потоку
— рабочий поток просыпается, получает результат и возвращает управление

Если же послать синхронное сообщение из оконного потока (точнее, из того же потока, к которому приписано данное окно), то оно выполнится немедленно, безо всяких прокачек.

Чем опасно посылать синхронные сообщения между потоками.
1) оконный поток в это время мог быть занят своими делами и не прокачивать очередь
2) рабочий поток блокируется на время вызова
3) если оконный поток захочет в этот момент синхронно поработать с рабочим потоком, он тоже заблокируется, и поймаем дедлок
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.