| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: ActiveX/СОМ/CORBA > Проблема передачи множества функций в поток |
| Автор: Caduser 24.1.2007, 02:50 | ||||||
Есть множество некоторых функций сервера приложений которые вызываются в клиенте так:
необходимо поместить вызов этих функций в поток, как это сделать? Пробовал так: Поместить объект DCOM в поток очень просто:
затем из основной программы:
Однако этот способ не эффективен т.к.: 1. будет замедлять скорость вызова пропорционально увеличению числа функций. 2. ситуация усложняется тем, что разным функциям нужно передавать различные параметры (например: DCOM.AppServer.Func5(par1, par2, par3); Прошу помощи в поиске эффективного решения (например с помощью переменной вариантного типа)??? |
| Автор: CatATonik 24.1.2007, 09:29 |
| Единственное универсальное решение которое приходит мне в голову, это передавать потоку название функции и список параметров, в виде вариантного массива, затем вызывать соответствующую функцию через IDispatch.Invoke. Гемморойно, зато универсально. |
| Автор: Caduser 24.1.2007, 09:49 | ||||
пусть геморойно, мне важно чтоб скорость вызова функции снизилось не значительно. IDispatch.Invoke А можно хотябы приблизительно накидать, как это будет выглядеть? Может как то так?
|
| Автор: CatATonik 24.1.2007, 10:05 | ||
Вот примерный набросок, также смотри функцию DispatchInvoke в модуле ComObj.
|
| Автор: Caduser 25.1.2007, 08:42 | ||||
Спасибо CatATonik, чувствую ответ уже близко. Во всяком случае этот код:
DispId функции возвращает верно, но безнадёжно спотыкается на:
с ошибкой "OLE error C0000005" тестовая функция не имеет параметров, но подозреваю что дело в переменной Params: TDispParams, не понятно как её заполнять? Вообще есть библиотека типов сервера (_TLB.pas) может его как то прикурить сюда? например DispId можно оттуда взять, тогда не нужен будет метод GetIDsOfNames. |
| Автор: CatATonik 25.1.2007, 09:45 |
| Так трудно сказать в чем дело. Может Result не установлен? |
| Автор: Caduser 26.1.2007, 05:25 | ||||
Заработало! Подвела меня невнимательность
Спасибо, CatATonik! P.S. Единственный недостаток всего этого - неудобно формировать параметры для функций, уж больно их много у меня. Особенно обидно что все функции уже описаны в _TLB.pas , теперь задумался - а может раннее связывание можно организовать, и быстрее будет работать, и проверка корректности вызовов сразу будет? |