|
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 29
|
||||||||||||||||
FoxPro Многопоточность и BDE17.10.2015, 16:01. Показов 1474. Ответов 6
Метки нет (Все метки)
Доброе время суток, уважаемые форумчане. Назрела такая проблема: возникла необходимость сравнить две базы данных 1С (состав - *.dbf, *.cdx). Построение списка файлов *.dbf в одной и в другой базе решил сделать в двух потоках, которые запускаются одновременно. Среди прочего, в этих потоках определяется количество записей в каждой таблице сравниваемых баз данных. При запуске потоков выполняется только один, а второй попросту виснет без каких-либо исключениях. Сделал пошаговую трассировку - и действительно, второй поток виснет на инструкции
По ссылке http://www.loginovprojects.ru/... deproblems ознакомился со статьёй и обратил внимание на следующее: " Многопоточное приложение виснет при работе с таблицами базы данных. Проблема возникает из-за того, что во всех потоках по умолчанию используется объект TSession с именем "Default". Похоже, что в недрах BDE какие-то ресурсы защищаются от одновременного доступа с помощью критической секции, либо мьютекса. Перед выполнением SQL-запроса происходит захват объекта синхронизации, а после выполнения запроса захват данного объекта снимается. Если при выполнении запроса произойдет исключение, то снятие блокировки может не произойти (это бывает не всегда, а только в некоторых ситуациях, вероятно, где-то по ошибке пропущен оператор TRY..FINALLY), и выполнение любого запроса из параллельного потока приведет к его зависанию, т.к. он будет вечно ждать снятия блокировки. Для решения данной проблемы следует для каждого потока создавать свой объект TSession с уникальным именем SessionName, и назначать SessionName всем используемым в данном потоке DB-компонентам. SessionName лучше сделать глобально уникальным (это предотвратит зависание, если в качестве объекта синхронизации используется именованный мьютекс) ". В каждом потоке динамически создаю объекты Tsession и TTable, однако результат тот же. Когда-то довольно часто работал с BDE, но компонентами TDataBase и TSeesion пользовался редко, практически позабыл про них. Может я что-то не так делаю (естественно, иначе работало бы ). Помогите, пожалуйста. Заранее благодарен.Привожу код. Первый поток:
0
|
||||||||||||||||
| 17.10.2015, 16:01 | |
|
Ответы с готовыми решениями:
6
Ремонт Прошу совета ПММ Krona BDE 4507 EU, ПММ Krona BDE 4507 EU Ошибка Е3 исчезла после чистки BDE BDE |
| 17.10.2015, 17:27 | ||||||
|
1. ну сравнить базы можно и не таким способом
2. я не вижу динамическое создание ни TTable, ни TSession вот так надо создавать
0
|
||||||
|
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 29
|
||||||
| 17.10.2015, 17:58 [ТС] | ||||||
|
Создание компонентов происходит в методе Execute потоков (если обратите внимание на мой код, начиная со строчки 70...). Согласен, что при создании компонента при отсутствии желания указывать на родителя лучше использовать переменную Self, а не nil, как в моём случае (хотя (могу ошибаться ) эффект один и тот же).
Если обратите внимание на процедуру GetAllFilesDB(DirPath1) (что касается первого потока, во втором всё аналогично), то увидите, что функция анализирует необходимую папку (переменная DirPath1, DirPath2) на наличие файлов *.dbf и загружает их список в память... Имена таблиц (полный путь к таблицам) меняются благодаря присвоения соответствующему свойству компонента TTable значения переменной sRec.Name типа TSearchRec... Но хватит об этом... Самое смешное - экспериментировал с кодом на работе в результате чего один из потоков сделал не автоматически запускающимся
Одного не могу понять - почему так? Я согласен, что необходимо создавать разные сессии, если обращение к одной и той же базе данных осуществляется из разных потоков. Однако мои потоки работают с базами, физически расположенными в разных директориях, а значит расцениваются как совершенно разные. Буду благодарен за объяснение.
0
|
||||||
|
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 29
|
|
| 17.10.2015, 18:33 [ТС] | |
|
Кстати, Delphi автоматически генерирует объект Session в каждом приложении, которое работает с базами данных. И как было указано в статье, представленной выше, имеет имя default.
Скорее всего, если выполнять операции над базами данных в потоках (фактически отдельные приложения), объект TSession не создаётся, либо создаётся, но при количестве потоков более одного происходит конфликт имён (если имена не назначать явно - n-ное количество "default"). Если неправильно рассудил, исправьте. Добавлено через 53 секунды qwertehok, Добавлено через 3 минуты Два одновременных потока не жизненная необходимость, а скажем так "личный каприз". Идея же - существует две базы 1С 7.7 (практически от них отошли (прошлый век, скажем так))... 1С работает в файл-серверной архитектуре, то есть располагается на каком-то диске и расшарена. Всё руки не доходили склипать батник или что-то своими ручками в Делфи для резервного копирования (причём не только различных баз данных, но и важных документов и иных файлов). Так вот, у меня к примеру есть резервная копия базы 1С, но в ней не хватает записей за 2 дня (не было возможности сделать рез. копию, а пользователь при этом работал и вбивал данные). При возникновении проблемы с этой БД, я открываю её и резервную копию двухдневной давности в моей программе. Программа проходит по файлам *.dbf и формирует MD5-отпечаток. Если MD-5 отпечатки сравниваемых таблиц не равен, значит базы отличаются. Остаётся обратиться к нужной таблице и выяснить какие поля изменил и какие записи добавил пользователь и внести эти изменения в стабильно работающую базу данных. А про мою задумку и MS SQL можно по-подробнее.
0
|
|
|
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
||
| 17.10.2015, 19:30 | ||
|
Делают-то они у тебя одно и тоже, но с разными исх.данными..
0
|
||
| 17.10.2015, 20:08 | |||
|
Flex_, ставь пользователю MS SQL (если база меньше 10 гигов то достаточно будет бесплатной версии), настраивай ежедневный бэкап (хочешь полный, хочешь с diff'ами) и не морочь голову с Delphi
И хочешь что бы у тебя все работало? Нет слов
0
|
|||
| 17.10.2015, 20:08 | |
|
Помогаю со студенческими работами здесь
7
Избавится от BDE BDE и SQL2012 BDE Admin запрос в BDE Работа с BDE Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|