Помогите с IMDD

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Помогите с IMDD

Сообщение Дед Пахом »

Только начал использовать In-Memory driver, и тут же нарвался на чёрт знает что.
Есть таблица (MySQL), гружу её в память в начале программы: MemAccess:Templates.Load(), всё работает оч. хор. В какой-то момент понадобилось мне дать возможность юзеру перегрузить данные с сервера в память, ну думаю, делов-то? опять MemAccess:Templates.Load(), ан нет, не работает! Стал разбираться и выяснил, что в методе Reset (который вызывается из Load) не отрабатывает строка OPEN(SELF.Target,lMode) - возвращает ошибку "Access Denied". Кто-нибудь пните меня в нужном направлении!
C8, ABC
С уважением, ДП
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Re: Помогите с IMDD

Сообщение Губин Игорь »

поставь для IMMD файлов read/write + deny none и разрешение на Create
Поток один?
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Помогите с IMDD

Сообщение Дед Пахом »

memory файл в словаре не описан, поток один. Но кажется причину понял - ABC-шный RelationManager открывает таблицу и держит её. Если вынести Load вне RelationManager.Open/Close фрейма, то imdd таблица перегружается (правда, данные в ней какие-то странные, блобы пустые вроде, но это уже другая история)
С уважением, ДП
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Re: Помогите с IMDD

Сообщение Губин Игорь »

Ну я или описываю файл в словаре, тогда работаю с ним стандартными средствами или пишу всё ручками на уровне Open/next...
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Помогите с IMDD

Сообщение Дед Пахом »

Вобщем, с IMDD можно спокойно работать только в потоке главного фрейма (THREAD() = 1), чуть в сторону, и то с ABC-шными FileManager'ами конфликт, то блобы не грузятся.
Кстати, Dynamic driver тоже то ещё фуфло - блобы он трактует как CSTRING, в результате теряем все данные после первого нулевого байта в блобе.
С уважением, ДП
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Re: Помогите с IMDD

Сообщение Губин Игорь »

Дед Пахом писал(а):Вобщем, с IMDD можно спокойно работать только в потоке главного фрейма (THREAD() = 1)
БРРРРРРРР! :shock: Или так криво сделан файловый менеджер в ABC (у меня легаси) или вы "просто не умете их готовить".
Я использую IMDD и в хвост и в гриву. И в один файл на все потоки и отдельные копии в каждом потоке. Единственное НО: гружу я данные в IMDD файл ручками, но так уж у меня задумано изначально.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Помогите с IMDD

Сообщение Дед Пахом »

Наверно, "не умею", но осадочек остался.
С уважением, ДП
Rimas
Ветеран
Сообщения: 496
Зарегистрирован: 07 Ноябрь 2005, 15:48
Откуда: Литва

Re: Помогите с IMDD

Сообщение Rimas »

Дед Пахом писал(а):Вобщем, с IMDD можно спокойно работать только в потоке главного фрейма (THREAD() = 1), чуть в сторону, и то с ABC-шными FileManager'ами конфликт, то блобы не грузятся.
Кстати, Dynamic driver тоже то ещё фуфло - блобы он трактует как CSTRING, в результате теряем все данные после первого нулевого байта в блобе.
DRIVER('Memory', '/THREADEDCONTENT’)
не то?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Помогите с IMDD

Сообщение Дед Пахом »

Не то по смыслу задачи - данные дожны быть одинаковыми в любом треде (то есть реальная таблица из БД).
С уважением, ДП
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Re: Помогите с IMDD

Сообщение Губин Игорь »

Не вижу где у тебя проблемы...
1. Ставь всегда Share
2. Ставь'/THREADEDCONTENT’
3. Заполнение базы веди в основном фрейме.

В этом случае после открытия каждого треда ты там получишь уникальный экземпляр полностью заполненной базы
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Помогите с IMDD

Сообщение Дед Пахом »

Губин Игорь писал(а):Не вижу где у тебя проблемы...
1. Ставь всегда Share
2. Ставь'/THREADEDCONTENT’
3. Заполнение базы веди в основном фрейме.

В этом случае после открытия каждого треда ты там получишь уникальный экземпляр полностью заполненной базы
1. Где Share ставить? In-Memory в словаре нет. Да он и так с модой 42h открывается (см. ABTblSyn.CLW)
2. Не пойму, зачем мне в каждом треде копия (нехилой) базы
3. Да, теперь так и сделал. Перед вызовом из главного меню процедуры, использующей In-Memory, сравниваю кол-во записей в реальной таблице и в памяти, при несовпадении гружу заново.

PS
так и чешутся руки отнаследоваться от FileSynchronizationClass и добавить всё что нужно в наследника, да хотя бы получить число записей в In-Memory надо написать

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

OPEN(Table)
nRecs = RECORDS(Table)
CLOSE(Table)
прежде чем Load вызвать.
С уважением, ДП
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Re: Помогите с IMDD

Сообщение Губин Игорь »

Дед Пахом писал(а):2. Не пойму, зачем мне в каждом треде копия (нехилой) базы
Дело в том, что если не ставить /threadcontent, то при изменении буфера в одном треаде он автоматически изменится и в другом. Вот такие пироги...

Насколько эти копии независимы, мне трудно сказать, не проверял. Надо протестировать. Может и одна копия с различными буферами.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Помогите с IMDD

Сообщение Дед Пахом »

Губин Игорь писал(а):Дело в том, что если не ставить /threadcontent, то при изменении буфера в одном треаде он автоматически изменится и в другом. Вот такие пироги...

Насколько эти копии независимы, мне трудно сказать, не проверял. Надо протестировать. Может и одна копия с различными буферами.
Судя по хелпу, в каждом треде своя копия всей таблицы.
С уважением, ДП
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Re: Помогите с IMDD

Сообщение Губин Игорь »

Сорри, нёс полную пургу про /threadcontent (нефиг работать головой после полуночи).
Ставить его не надо в твоём случае. Речь должна идти о THREAD в описании структуры..

MemoryFile FILE,DRIVER('MEMORY'),PRE(MemF),BINDABLE,CREATE,THREAD ! Порождено словарём
Открывается везде 42h
Заполнение ведётся в потоке фрейма, но с вызовом отдельной процедуры с собственным открытием/закрытием файлов.

Если не поставить THREAD, то, как и следует ожидать, портятся буфера файла в разных потоках
Если не поставить 42h, то в потоке выдаётся ошибка открытия

Проверка сейчас велась на легаси. Окрытие файлов производилось штатными средствами шаблонов, никакого рукописания.
Это я только кажусь дураком! На самом деле я полный идиот!
Ответить