Страница 1 из 1
MultiDll - передать событие окну
Добавлено: 17 Декабрь 2017, 12:10
gopstop2007
Привет всем !
Хочу поднять старую тему, хотя она уже вроде не раз обсуждалась. С10.0.12799 (ABC)
Есть два MDI окна из разных DLL например: A_mdi(invoice.dll) и B_mdi(barcode.dll)
B_mdi - окно для считывания, ввода штрих кода
A_mdi - окно накладной/счета со списком товара(browse), заполняемый при считывании штрих кода в окне B_mdi
Стандартная схема не работает:
Объявляем в обоих окнах Local Data
Считываем при запуске
При считывании штрих кода в B_mdi передаем в A_mdi поток событие:
В A_mdi -> TakeEvent обрабатываем и пытаемся обновить browse со списком добавленного товара
Код: Выделить всё
IF Event() = Event:ResetMyBrowse THEN BRWх.Resetfromview END
Но событие до TakeEvent не доходит

Если приложение собрано не MultiDll данная конструкция работает, я понимаю проблемы скрываются в деталях, поэтому и прощу помощи.
Заранее спасибо.
MultiDll - передать событие окну
Добавлено: 17 Декабрь 2017, 14:43
Yufil
Попробуй для начала на окно A таймер повесить. Если mdi-окно не находится сверху, нет никаких особых причин крутить цикл accept ...
MultiDll - передать событие окну
Добавлено: 17 Декабрь 2017, 16:36
Игорь Столяров
gopstop2007 писал(а): 17 Декабрь 2017, 12:10Есть два MDI окна из разных DLL
По сути всё правильно, скорее всего проблема в реализации ...
Скажите пожалуйста, а Glo:ProcessA в этой истории где находится ?
1. Если вот здесь вставить проверку:
Код: Выделить всё
Message('The thread A: ' & Glo:ProcessA)
Post(Event:ResetMyBrowse,,Glo:ProcessA)
Вы номер потока A видите ?
2. Как вариант, можно попробовать передать событие через AppFrame. Т.е.:
и в AppFrame уже транслировать событие в MDI Windows:
Код: Выделить всё
Of Event: ResetMyBrowse
Message('The thread A: ' & Glo:ProcessA)
Post(Event:ResetMyBrowse,,Glo:ProcessA)
Вообще в таких случаях очень полезно вылезти из своего приложения, сделать "чистый" APP с 2 пустыми
окнами и посмотреть как всё работает. Если всё равно непонятно: то опубликовать пример ...

MultiDll - передать событие окну
Добавлено: 17 Декабрь 2017, 16:46
kreator
gopstop2007 писал(а): 17 Декабрь 2017, 12:10
Если приложение собрано не MultiDll данная конструкция работает, я понимаю проблемы скрываются в деталях, поэтому и прощу помощи.
Заранее спасибо.
Подозреваю, здесь проблема. В теории не должно быть разницы. Мы посылаем post в тред, а он никак не связан с dll. У меня много таких взаимодействий, но вот насчёт разных dll не уверен, вряд ли есть такое.
А это реальная схема - считывание штрих-кода в другом окне? Зачем? Но это так, лирика. Может попробовать для начала послать какие-нибудь стандартные ивенты, чтобы убедиться в работе схемы.
MultiDll - передать событие окну
Добавлено: 17 Декабрь 2017, 16:59
gopstop2007
Yufil писал(а): 17 Декабрь 2017, 14:43
Попробуй для начала на окно A таймер повесить. Если mdi-окно не находится сверху, нет никаких особых причин крутить цикл accept ...
без толку, при открытии B_mdi даже не отрабатывает

Скажите пожалуйста, а Glo:ProcessA в этой истории где находится ?
в dictonary -> Global (секции)
Вы номер потока A видите ?
Номер потока вижу
2. Как вариант, можно попробовать передать событие через AppFrame.
Когда передаю - вижу
и в AppFrame уже транслировать событие в MDI Windows:
тоже пробовал - не передает
Может попробовать для начала послать какие-нибудь стандартные ивенты
Нет результата.
Все выше сказанное пробовал до написания на форум, поэтому и обратился. Насчет примера, еще помучаюсь, и выброшу, если решения не будет

MultiDll - передать событие окну
Добавлено: 17 Декабрь 2017, 17:01
Игорь Столяров
gopstop2007 писал(а): 17 Декабрь 2017, 16:59Все выше сказанное пробовал до написания на форум
Тады давайте пример ! До Рождественных чудес еще далеко ....

MultiDll - передать событие окну
Добавлено: 17 Декабрь 2017, 22:51
arlean1
иногда помогает самому порулить через
REGISTER(EVENT: .... , , )
MultiDll - передать событие окну
Добавлено: 18 Декабрь 2017, 10:04
Yufil
Мне когда-то всё это надоело, сделал глобальную очередь, куда помещаются команды для разных тредов ( правда, в основном, для application ).
Команда имеет поля время исполнения/целевой тред/вид операции/параметр операции. Указывая время исполнения можно устанавливать задержки при необходимости, когда необходимо открыть два mdi-окна сразу или закрыть одно окно и сразу по закрытии открыть другое (у меня достаточно частая операция и не слишком стабильная, увы... ).
По Idle или таймеру идёт опрос очереди команд ( не забыть о крит.секциях, мьютексах и прочих семафорах Дейкстры ), команды выполняются и исключаются из очереди. Обработкой занимается ровно один центр, оно как-то проще...
MultiDll - передать событие окну
Добавлено: 18 Декабрь 2017, 12:21
gopstop2007
Перебросил B_mdi в appframe( my.exe) стало работать. Позже вернусь к данной проблеме, просто цейтнот. Спасибо всем кто откликнулся.