MultiDll - передать событие окну

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

MultiDll - передать событие окну

Сообщение gopstop2007 »

Привет всем !
Хочу поднять старую тему, хотя она уже вроде не раз обсуждалась. С10.0.12799 (ABC)
Есть два MDI окна из разных DLL например: A_mdi(invoice.dll) и B_mdi(barcode.dll)
B_mdi - окно для считывания, ввода штрих кода
A_mdi - окно накладной/счета со списком товара(browse), заполняемый при считывании штрих кода в окне B_mdi

Стандартная схема не работает:
Объявляем в обоих окнах Local Data

Код: Выделить всё

Event:ResetMyBrowse  EQUATE(Event:User+33)
Считываем при запуске

Код: Выделить всё

Glo:ProcessA = Start(A_mdi,25000)
При считывании штрих кода в B_mdi передаем в A_mdi поток событие:

Код: Выделить всё

Post(Event:ResetMyBrowse,,Glo:ProcessA)  
В A_mdi -> TakeEvent обрабатываем и пытаемся обновить browse со списком добавленного товара

Код: Выделить всё

  IF Event() = Event:ResetMyBrowse THEN BRWх.Resetfromview END
Но событие до TakeEvent не доходит :(
Если приложение собрано не MultiDll данная конструкция работает, я понимаю проблемы скрываются в деталях, поэтому и прощу помощи.
Заранее спасибо.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

MultiDll - передать событие окну

Сообщение Yufil »

Попробуй для начала на окно A таймер повесить. Если mdi-окно не находится сверху, нет никаких особых причин крутить цикл accept ...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

MultiDll - передать событие окну

Сообщение Игорь Столяров »

gopstop2007 писал(а): 17 Декабрь 2017, 12:10Есть два MDI окна из разных DLL
По сути всё правильно, скорее всего проблема в реализации ...
Скажите пожалуйста, а Glo:ProcessA в этой истории где находится ?

1. Если вот здесь вставить проверку:

Код: Выделить всё

   Message('The thread A: ' & Glo:ProcessA)
   Post(Event:ResetMyBrowse,,Glo:ProcessA)
Вы номер потока A видите ?

2. Как вариант, можно попробовать передать событие через AppFrame. Т.е.:

Код: Выделить всё

    Post(Event:ResetMyBrowse,,1)
и в AppFrame уже транслировать событие в MDI Windows:

Код: Выделить всё

   Of Event: ResetMyBrowse
        Message('The thread A: ' & Glo:ProcessA)
        Post(Event:ResetMyBrowse,,Glo:ProcessA)
Вообще в таких случаях очень полезно вылезти из своего приложения, сделать "чистый" APP с 2 пустыми
окнами и посмотреть как всё работает. Если всё равно непонятно: то опубликовать пример ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

MultiDll - передать событие окну

Сообщение kreator »

gopstop2007 писал(а): 17 Декабрь 2017, 12:10 Если приложение собрано не MultiDll данная конструкция работает, я понимаю проблемы скрываются в деталях, поэтому и прощу помощи.
Заранее спасибо.
Подозреваю, здесь проблема. В теории не должно быть разницы. Мы посылаем post в тред, а он никак не связан с dll. У меня много таких взаимодействий, но вот насчёт разных dll не уверен, вряд ли есть такое.
А это реальная схема - считывание штрих-кода в другом окне? Зачем? Но это так, лирика. Может попробовать для начала послать какие-нибудь стандартные ивенты, чтобы убедиться в работе схемы.
We are hard at work… for you. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

MultiDll - передать событие окну

Сообщение gopstop2007 »

Yufil писал(а): 17 Декабрь 2017, 14:43 Попробуй для начала на окно A таймер повесить. Если mdi-окно не находится сверху, нет никаких особых причин крутить цикл accept ...
без толку, при открытии B_mdi даже не отрабатывает :(
Скажите пожалуйста, а Glo:ProcessA в этой истории где находится ?
в dictonary -> Global (секции)
Вы номер потока A видите ?
Номер потока вижу
2. Как вариант, можно попробовать передать событие через AppFrame.
Когда передаю - вижу
и в AppFrame уже транслировать событие в MDI Windows:
тоже пробовал - не передает :(
Может попробовать для начала послать какие-нибудь стандартные ивенты
Нет результата.
Все выше сказанное пробовал до написания на форум, поэтому и обратился. Насчет примера, еще помучаюсь, и выброшу, если решения не будет :)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

MultiDll - передать событие окну

Сообщение Игорь Столяров »

gopstop2007 писал(а): 17 Декабрь 2017, 16:59Все выше сказанное пробовал до написания на форум
Тады давайте пример ! До Рождественных чудес еще далеко .... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
arlean1
Активист
Сообщения: 114
Зарегистрирован: 24 Июль 2016, 22:34

MultiDll - передать событие окну

Сообщение arlean1 »

иногда помогает самому порулить через
REGISTER(EVENT: .... , , )
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

MultiDll - передать событие окну

Сообщение Yufil »

Мне когда-то всё это надоело, сделал глобальную очередь, куда помещаются команды для разных тредов ( правда, в основном, для application ).

Команда имеет поля время исполнения/целевой тред/вид операции/параметр операции. Указывая время исполнения можно устанавливать задержки при необходимости, когда необходимо открыть два mdi-окна сразу или закрыть одно окно и сразу по закрытии открыть другое (у меня достаточно частая операция и не слишком стабильная, увы... ).

По Idle или таймеру идёт опрос очереди команд ( не забыть о крит.секциях, мьютексах и прочих семафорах Дейкстры ), команды выполняются и исключаются из очереди. Обработкой занимается ровно один центр, оно как-то проще...
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

MultiDll - передать событие окну

Сообщение gopstop2007 »

Перебросил B_mdi в appframe( my.exe) стало работать. Позже вернусь к данной проблеме, просто цейтнот. Спасибо всем кто откликнулся.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить