![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вызвать функцию хоста из 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]Как вариант, можно послать сообщение окну хоста.