Привет,
У меня есть задача — сделать С++ DLL, фукнции которой будут дергаться из VB. Вопрос том как организовать асинхронность вызова, чтобы не блокировать VB приложение на время выполнения C++ функции. Простейшее решение — сделать две функции, одна запускает операцию, другая возвращает результат — но это как-то не очень красиво.
Может у кого-нибудь есть идеи, как можно сделать callback в этой ситуации?
Спасибо
15.01.10 12:41: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Я нашел решение, может кому пригодится:
В VB есть оператор AddressOf, с поомщью которого можно передать адрес VB-шной функции как колбека. Подробности тут:
http://support.microsoft.com/kb/181578
Здравствуйте, cozy, Вы писали:
C>Я нашел решение, может кому пригодится:
C>В VB есть оператор AddressOf, с поомщью которого можно передать адрес VB-шной функции как колбека. Подробности тут: http://support.microsoft.com/kb/181578
А как у васика дела с многопоточностью?
Ведь, если функция выполняется асинхронно, это значит — в другом потоке. И колбек тоже вызовет в этом другом потоке.
Может быть, удобнее будет послать какое-то сообщение какому-то окошку, а уже в окошке обработать как следует.
Впрочем, этим может озаботиться непосредственно колбек.
cozy wrote:
> Не уверен на счет многопоточности в VB — может оно там под капотом само
> снихронизирует доступ. Но думаю месседж — то, что надо.
Синхронизация есть только при доступе к методам COM-объекта.
Я бы рекомендовал написать в таком случае COM-объект (Active-X).
Там уже есть модели многопоточности, и, на сколько я понимаю,
VB сможет как минимум правильно работать с асинхронно работающим
объектом.
Posted via RSDN NNTP Server 2.1 beta
Здравствуйте, MasterZiv, Вы писали:
На самом деле, текст статика на формочке отлично меняется из коллбека безо всяких проблем, а по условию задачи ничего больше и не надо было. Так что обошелся даже без сообщения окну
Здравствуйте, cozy, Вы писали:
C>На самом деле, текст статика на формочке отлично меняется из коллбека безо всяких проблем, а по условию задачи ничего больше и не надо было. Так что обошелся даже без сообщения окну
На
самом деле, там как раз синхронные сообщения летают (статик и формочка — это ведь тоже окна).
— рабочий поток синхронно (SendMessage) посылает WM_SETTEXT окну... кладёт его в очередь оконного потока, и засыпает
— оконный поток в главном или модальном цикле обработки сообщений
— — вынимает сообщение из очереди (PeekMessage / GetMessage),
— — вызывает (DispatchMessage) обработчик соответствующего окна — статика на формочке
— — дожидается его исполнения
— — пересылает результат рабочему потоку
— рабочий поток просыпается, получает результат и возвращает управление
Если же послать синхронное сообщение из оконного потока (точнее, из того же потока, к которому приписано данное окно), то оно выполнится немедленно, безо всяких прокачек.
Чем опасно посылать синхронные сообщения между потоками.
1) оконный поток в это время мог быть занят своими делами и не прокачивать очередь
2) рабочий поток блокируется на время вызова
3) если оконный поток захочет в этот момент синхронно поработать с рабочим потоком, он тоже заблокируется, и поймаем дедлок