Перенос Global Data
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Перенос Global Data
Старое приложение (C6.3), локальная сборка (один exe файл), решил переделать в приложение с dll (C10). Глобальные данные пытаюсь перенести в dct, чтобы были видны для всех dll, но как быть с глобальными данными которые остались в приложении? После переброски в dct, они в приложении присутствуют, но не поддаются удалению
Замкнутый круг
Прошу Вашей помощи 
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Дед Пахом
- Старичок
- Сообщения: 3345
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 20 раз
- Поблагодарили: 56 раз
- Контактная информация:
Перенос Global Data
Как вариант выгрузить в TXA, грохнуть там всё лишнее и загрузить TXA в пустое APP.
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4019
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 59 раз
- Поблагодарили: 41 раз
- Контактная информация:
Перенос Global Data
Вот этого не понял. Как так не поддаются удалению?
Такое по идее может быть только в случае если их шаблон добавляет. При удалении таких глобальных переменных, шаблон при компиляции, опять их добавит. Но в таком случае нужно c шаблонами разбираться. Кого из них в главную DLL переносить.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Игорь Столяров
- Ветеран движения
- Сообщения: 8239
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 105 раз
Перенос Global Data
Здесь конечно лучше бы решать задачу по частям.
Сначала трансформировать приложение в Multi-DLL, а потом перенести его из C63 в C10.
Оба процесса имеют свои нюансы, и непонятно где проблема ...
Здесь не все так просто. Есть ограничения на использование данных с атрибутом THREAD.
Посмотри в справке раздел "Clarion 6 Migration Tips -> General Rules regarding your data and the new Thread Model" и далее.
Лучше всего разобраться с данными и разделить их как текст (кнопка DATA) между основным EXE и DLL.
За теми, кто отстал, не возвращаться !
Кодекс
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Перенос Global Data
Удалить то дает, но если выйти и зайти снова в апп видишь снова "удаленные" данные
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Перенос Global Data
Я так и сделал
Спасибо почитаюЗдесь не все так просто. Есть ограничения на использование данных с атрибутом THREAD.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Перенос Global Data
Спасибо, я так понимаю, единственное решение . Ох и нелегкая работа тянуть бегемота из болота...
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Игорь Столяров
- Ветеран движения
- Сообщения: 8239
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 105 раз
Перенос Global Data
То же самое, если удалить описание файла БД - он будет заново создан по описанию в DCT.gopstop2007 писал(а): но если выйти и зайти снова в апп видишь снова "удаленные" данные
Ты используешь описание Global Data в DCT не по назначению. Эта возможность предназначена, для
проектов, которые состоят из большого кол-ва мелких Local EXE файлов, и в которых должен быть
ОДИНАКОВЫЙ набор таблиц БД и глобальных данных. В этом случае их описании выносится в DCT.
Для Multi-DLL эта схема не может работать в принципе. Потому, что если, например в DLL переменная
описана и под нее выделяется память, то в EXE обращение к этой переменной уже должно не выделять
память, а обращаться к области памяти выделенной в DLL. И поэтому описание в EXE и DLL одной и той
же переменной для общего использование будет разным. (см. атрибут EXTERNAL)
Ну это если совсем упрощенно объяснять.
За теми, кто отстал, не возвращаться !
Кодекс
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Перенос Global Data
Спасибо за информацию, но для меня не всё понятноНу это если совсем упрощенно объяснять.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Игорь Столяров
- Ветеран движения
- Сообщения: 8239
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 105 раз
Перенос Global Data
Заранее извиняюсь, если сейчас буду писать тривиальные вещи. Но что бы все прояснить:
MultiDLL проект - это не произвольный набор DLL файлов + EXE.
Поэтому просто "порезать" большой EXE на несколько DLL + EXE не получится.
Проект должен быть структурирован и более того, эта структура обязательно должна быть иерархической (не сетевой).
Т.е. нельзя, что бы из DLL 1 вызывался метод из DLL 2 и наоборот. Потому что при сборке каждого DLL будет требоваться
LIB файл с описанием методов в другом DLL (это можно обойти, но это уже совсем другая история).
Это относится как коду (вызов процедур), так и к данным.
Теперь конкретно по вопросу. Если есть некая структура данных, то она должна быть описана в DLL самого низкого уровня.
В DLL (или EXE) более высокого уровня эта же структура описывается с атрибутом EXTERNAL с указанием модуля в котором
она описана на нижнем уровне. Но это в теории.
Здесь еще есть зависимость от того имеет ли структура данных атрибут THEREAD.
Посмотри раздел справки "EXTERNAL - Thread Considerations" - в принципе все описано.
За теми, кто отстал, не возвращаться !
Кодекс
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Перенос Global Data
Я так и использовал в C6.3, но потом заметил, что если эти данные использовать в dct в Globals , отпадает необходимость "дублировать" данные в dll с атрибутом EXTERNAL. Не буду утверждать, что мое решение верно и поэтому интересовался последствиями данного решенияИгорь Столяров писал(а):Здесь еще есть зависимость от того имеет ли структура данных атрибут THEREAD.
Посмотри раздел справки "EXTERNAL - Thread Considerations" - в принципе все описано.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5535
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 77 раз
Перенос Global Data
Эти вещи разруливаются на уровне шаблонов. В заглавной dll делаются обычные декларации глобалов (таблиц или переменных из dct), в других dll/exe в шаблонах ставится флажок, что глобалы объявлены в другой dll и декларации создаются с атрибутом external. Тредность без разницы, ее надо при работе учитывать.
C6/C12, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 8239
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 105 раз
Перенос Global Data
Последствия тривиальны и очевидны. Если в разных модулях ты используешь структуры данных
с одинаковым названием и без атрибута External, то это просто разные структуры данных.
По аналогии, как ты в разных процедурах, можешь описать данные с одинаковым наименованием.
Это нормально, потому что область использования переменной локализована модулем.
Абсолютно верно ! Но есть настоятельные рекомендации не использовать составные структуры EXTERNAL без атрибута THREAD.finsoftrz писал(а): Эти вещи разруливаются на уровне шаблонов. В заглавной dll делаются обычные декларации глобалов (таблиц или переменных из dct), в других dll/exe в шаблонах ставится флажок, что глобалы объявлены в другой dll и декларации создаются с атрибутом external. Тредность без разницы, ее надо при работе учитывать.
(т.е. данные к которым есть доступ из всех потоков в MultiDLL). Наверно по тому, что она будет использовать STATIC память ...
За теми, кто отстал, не возвращаться !
Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5535
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 77 раз
Перенос Global Data
Я использую несколько глобальных очередей, объявленных в словаре, без thread. Только для внутрисистемных нужд. Работа с ними оформлена в специальные процедуры и использует критические секции плюс глобальный флажок (для надежности). Тестировал жестко, проблем нет.
В общем случае, конечно, использования глобалов без thread нужно избегать.
В общем случае, конечно, использования глобалов без thread нужно избегать.
C6/C12, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 8239
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 105 раз
Перенос Global Data
Да, потому что если использовать Global Queue для пользовательских данных (с неконтролируемым объемом) - это чревато проблемами.
Но мы решаем этот вопрос по другому.
Структура данных (QUEUE) "заперта" внутри DLL, но ее данные можно использовать с помощью методов, которые
вызываются уже из этого DLL другими модулями.
Причина еще в том, что в Clarion есть система семафоров для
избегания конфликтов как раз при использовании таких данных и ее удобно использовать при обращении за данными
GLOBAL QUEUE через методы работы с ней, а не напрямую.
Но мы решаем этот вопрос по другому.
Структура данных (QUEUE) "заперта" внутри DLL, но ее данные можно использовать с помощью методов, которые
вызываются уже из этого DLL другими модулями.
избегания конфликтов как раз при использовании таких данных и ее удобно использовать при обращении за данными
GLOBAL QUEUE через методы работы с ней, а не напрямую.
За теми, кто отстал, не возвращаться !
Кодекс
