Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизКак вызвать функцию хоста из dll? Найти похожие ветки
← →
kreyl (2006-05-31 10:37) [0]Есть приложение-хост, оно загружает плагин-длл. Хост, соответственно, может вызывать функции плагина. А как из плагина вызвать функцию хоста?
Нужно вот для чего. Плагин что-то обслуживает или считает что-то длительное. И когда он с этой работой покончил, нужно дать знать хосту.
Заранее спасибо :-)
← →
Dmitrij_K (2006-05-31 10:39) [1]Как вариант, можно послать сообщение окну хоста.
← →
wal © (2006-05-31 10:41) [2]Хост, давая команду на обслуживание или расчет чего-то длительного передает адрес CallBack-функции.
← →
DrPass © (2006-05-31 10:47) [3]Или пусть себе считает в отдельном потоке - тогда и посылать ничего не нужно
← →
kreyl (2006-05-31 10:56) [4]2 DrPass:
Считать-то он по-любому будет в отдельном потоке, поскольку таких вычислений может быть не одно :-)
Идея вот какая: пришел клиент, говорит - посчитайте мне. Хост запускает расчет, а клиенту говорит - ждите. Потом расчет закончился, хост об этом как-то узнал, и говорит клиенту - нате вам результат.
← →
StriderMan © (2006-05-31 11:45) [5]CALLBACK однозначно. Просто и со вкусом.
← →
DrPass © (2006-05-31 12:23) [6]
> расчет закончился, хост об этом как-то узнал,
Функция расчета вернула управление - вот и узнал. Callback тут как бы и не нужен.
← →
evvcom © (2006-05-31 14:34) [7]
> Функция расчета вернула управление -
Куда она вернула управление, если работает в отдельном потоке? Сначала сам разберись, а потом уж советы давать лезь.
Варианта 2, как уже говорили:
1. [1];
2. [2].
Мне нравится [1] через PostMessage - писанины на 3 строчки меньше и меньше затрат на переключение контекстов потоков.
← →
DrPass © (2006-05-31 15:02) [8]
> evvcom © (31.05.06 14:34) [7]
эээ... а что такое поток? Темный ящик у бабушки на балконе?
Поясняю для непонятливых: для обработки запроса хост создает обслуживающий его поток, в этом потоке происходит обращение к DLL, функция в DLL сделала свои расчеты, или что она там делает, и вернула управление туда, откуда она была вызвана, в том же потоке, но в хост-приложении, который и делает завершающие операции. Никакой лапши из колбеков и сообщений без 100% необходимости городить не нужно - это плохой тон программирования, ибо потом программа рискует перерасти в нечто невразумительное и нечитаемое. А в поставленной задаче необходимости как раз не видно.
← →
isasa © (2006-05-31 15:25) [9]evvcom © (31.05.06 14:34) [7]
а мне больне нравится SendMessage(HostWinHandle, WM_COPYDATA ...);
для синхронизации полезно, да и передать можно много чего. :)
← →
evvcom © (2006-05-31 16:33) [10]
> для обработки запроса хост создает обслуживающий его поток,
> в этом потоке происходит обращение к DLL
Это другое дело, только тогда можно наступить на другие грабли: функция(-ии) в dll должна(-ы) быть потокобезопасной(-ыми).
> мне больне нравится SendMessage
можно, если очень хочется. SendMessage приведет к переключению контекста потока на основной, потом после обработки сообщения еще одно переключение уже назад на дополнительный поток только для того, чтобы уснуть или умереть, и опять переключение на основной. С постом будет всего одно переключение, но и через него можно подготовить большой объем данных, передать и уснуть(умереть), не щелкая туда-сюда контекст потока.
← →
kreyl (2006-06-02 13:53) [11]Большое спасибо, очень познавательно :-) Разобрался :-)
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c