Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как вызвать функцию хоста из dll?


kreyl ©   (2006-05-31 10:37:00) 

Есть приложение-хост, оно загружает плагин-длл. Хост, соответственно, может вызывать функции плагина. А как из плагина вызвать функцию хоста?

Нужно вот для чего. Плагин что-то обслуживает или считает что-то длительное. И когда он с этой работой покончил, нужно дать знать хосту.

Заранее спасибо :-)


kreyl   (2006-06-02 13:53:00) [1]

Большое спасибо, очень познавательно :-) Разобрался :-)


evvcom   (2006-05-31 16:33:00) [2]


> для обработки запроса хост создает обслуживающий его поток,
>  в этом потоке происходит обращение к DLL

Это другое дело, только тогда можно наступить на другие грабли: функция(-ии) в dll должна(-ы) быть потокобезопасной(-ыми).

> мне больне нравится SendMessage

можно, если очень хочется. SendMessage приведет к переключению контекста потока на основной, потом после обработки сообщения еще одно переключение уже назад на дополнительный поток только для того, чтобы уснуть или умереть, и опять переключение на основной. С постом будет всего одно переключение, но и через него можно подготовить большой объем данных, передать и уснуть(умереть), не щелкая туда-сюда контекст потока.


isasa   (2006-05-31 15:25:00) [3]

evvcom ©   (31.05.06 14:34) [7]

а мне больне нравится SendMessage(HostWinHandle, WM_COPYDATA ...);
для синхронизации полезно, да и передать можно много чего. :)


DrPass   (2006-05-31 15:02:00) [4]


> evvcom ©   (31.05.06 14:34) [7]

эээ... а что такое поток? Темный ящик у бабушки на балконе?
Поясняю для непонятливых: для обработки запроса хост создает обслуживающий его поток, в этом потоке происходит обращение к DLL, функция в DLL сделала свои расчеты, или что она там делает, и вернула управление туда, откуда она была вызвана, в том же потоке, но в хост-приложении, который и делает завершающие операции. Никакой лапши из колбеков и сообщений без 100% необходимости городить не нужно - это плохой тон программирования, ибо потом программа рискует перерасти в нечто невразумительное и нечитаемое. А в поставленной задаче необходимости как раз не видно.


evvcom   (2006-05-31 14:34:00) [5]


> Функция расчета вернула управление -

Куда она вернула управление, если работает в отдельном потоке? Сначала сам разберись, а потом уж советы давать лезь.
Варианта 2, как уже говорили:
1. [1];
2. [2].
Мне нравится [1] через PostMessage - писанины на 3 строчки меньше и меньше затрат на переключение контекстов потоков.


DrPass   (2006-05-31 12:23:00) [6]


> расчет закончился, хост об этом как-то узнал,

Функция расчета вернула управление - вот и узнал. Callback тут как бы и не нужен.


StriderMan   (2006-05-31 11:45:00) [7]

CALLBACK однозначно. Просто и со вкусом.


kreyl   (2006-05-31 10:56:00) [8]

2 DrPass:
Считать-то он по-любому будет в отдельном потоке, поскольку таких вычислений может быть не одно :-)
Идея вот какая: пришел клиент, говорит - посчитайте мне. Хост запускает расчет, а клиенту говорит - ждите. Потом расчет закончился, хост об этом как-то узнал, и говорит клиенту - нате вам результат.


DrPass   (2006-05-31 10:47:00) [9]

Или пусть себе считает в отдельном потоке - тогда и посылать ничего не нужно


wal   (2006-05-31 10:41:00) [10]

Хост, давая команду на обслуживание или расчет чего-то длительного передает адрес CallBack-функции.


Dmitrij_K   (2006-05-31 10:39:00) [11]

Как вариант, можно послать сообщение окну хоста.


Наверх

Титульная страница Поиск, карта сайта Написать письмо