Форум » [x]Harbour » Работа с базой в потоках » Ответить

Работа с базой в потоках

Andrey: Получаю данные у себя в проге на Минигуи из программы на C# с помощью GETMESSAGEDATA() Далее эти данные нужно записать в открытую базу данных, там не много 4-5 полей всего. Вопрос такой как лучше это сделать в текущем потоке или создать новый поток ? Допустим юзер сидит в другой базе и правит запись, а тут приходит SendMessage() из другой программы и пишет в свою базу. Конфликт однако... Как лучше сделать ?

Ответов - 11

Dima: Отдельный поток , Shared mode и новый Alias для этой базы

Haz: Andrey пишет: Конфликт однако... Какой конфликт ? а блокировка записи и протокол ? В потоке поучил и сохранил в журнал. Потом в потоке разгребаем журнал, открыв рабочую базу с другим алиасом в шаре. все что удалось записать подчищаем в журнале, там где нарвались на блокировку - в следующий раз ( по таймеру к примеру) Дима опередил Отдельный поток , Shared mode и новый Alias для этой базы

Andrey: Haz пишет: Какой конфликт ? а блокировка записи и протокол ? В потоке поучил и сохранил в журнал. Потом в потоке разгребаем журнал, открыв рабочую базу с другим алиасом в шаре. все что удалось записать подчищаем в журнале, там где нарвались на блокировку - в следующий раз ( по таймеру к примеру) Может и неправильно объяснил. Юзер сидит в базе Договоров и правит запись. Тут приходит SendMessage() из 10 записей, которые нужно записать в базу Заявок. Сама база уже открыта с нужным ключом. Тогда создаю отдельный поток и не нужно открывать заново базу заявок, она уже открыта. Просто записываю эти 10 заявок и закрываю поток. Можно же так ? Правда, да остаётся блокировка записи заявок, если вдруг кто-то правит эту запись. Тогда наверное эту запись в Public массив и обрабатывать этот Public массив в следующий раз по таймеру или при следующем SendMessage(). Вот примерно так мыслю.


Dima: Andrey пишет: Тогда создаю отдельный поток и не нужно открывать заново базу заявок, она уже открыта. Тебе ведь написали как сделать корректно. Пока ты соберешься туда писать , юзер может базу уже закрыть и писать ты будешь на деревню к бабушке и снова чекать свой error.log а почему же упало то

Haz: Andrey пишет: и не нужно открывать заново базу заявок, она уже открыта. в многопоточке невозможно в один единственный алиас писать или читать с разных потоков одновременно. Если юзер открыл базу в Алисе, то для работы из другого потока с этим алиасом у юзера придётся ее забрать . Почитай доки Кресина А. там доступно написано и с примерами. Работать с базой можно по очереди в потоках через зеро Спейс или в каждом потоке открывать в шаре. В твоем случае только в шаре. Сохранение данных в массиве – это предпосылка к потере данных в случае неуспеха записи при блокировке и когда пользователь закрыл программу. Ведёшь в локальной базе журнал, и по мере записи удаляешь из журнала. Даже если рухнет питание всегда будешь знать что не успел из полученного записать

Dima: Haz пишет: в многопоточке невозможно в один единственный алиас писать или читать с разных потоков одновременно Да ладно.... Haz пишет: В общем в потоке можно открывать базу с тем же алиасом, основной процесс и поток друг другу не мешают, ничего подменять тогда не надо. Бровс легко управляется из потока как public объект http://clipper.borda.ru/?1-1-0-00000594-000-10001-0-1603914204

Haz: Dima пишет: Да ладно.... Я говорил ЕДИНСТВЕННЫЙ ( один и тот же ). В том что ты процитировал их два, пусть и с одинаковым именем. По сути это две разные рабочие области. Не стал Андрея грузить этим фокусом, чтоб не запутать окончательно. Если коротко , в потоках рабочие области изолированы и видны только в самом потоке, поэтому не принципиально каким именем-алиасом обозвать область если ее не передавать из потока в поток. конфликт имен алиасов возникнет только если из одного потока алиас передать в зеро, а потом подключить к другому потоку где этот алиас уже использовался в качестве имени рабочей области

SergKis: Andrey пишет Вопрос такой как лучше это сделать в текущем потоке или создать новый поток ? По мне лучше работать в фоне, т.е. сделать отд. клиента (консоль, vwt) для работы с P.sql, т.к. ты вынул из hmg работу с P.sql в C#, то тебе надо как то управлять этой прогой, запускать\останавливать или она запускает клиента для внесения изменений в базу (это ты лучше знаешь кто главный). Нагружать основную прогу hmg алгоритмами с потоками (с обработкой журналов), по мне лишнее. Вдруг понадобится не P.sql, а Mysql ?

Andrey: SergKis пишет: т.е. сделать отд. клиента (консоль, vwt) для работы с P.sql, т.к. ты вынул из hmg работу с P.sql в C#, то тебе надо как то управлять этой прогой, запускать\останавливать или она запускает клиента для внесения изменений в базу (это ты лучше знаешь кто главный). Нагружать основную прогу hmg алгоритмами с потоками (с обработкой журналов), по мне лишнее. Работа с PostgreSQL (в части только чтения из инета) выкинута из основной проги и перенесена в отдельную прогу на C# Прога на C# читает каждые 5-10 минут базу в инете и передаёт записи подвергшие правке за сегодня в мою прогу через SendMessage(), а дальше я сам эти записи пишу в основную базу. Вот и спрашивал как писать лучше, чтобы не нагружать свою основную прогу. Из C# нет возможности писать в dbf новой структуры Харбора, нет возможности работы с индексом CDX. Если кто подскажет, буду очень признателен Из-за этого приходиться пользоваться передачей данных между программами через SendMessage(). Отдельную прогу под это писать наверное нет смысла и ехе-ник весит порядочно. Да и в добавок есть ещё доп. меню в C# перемещаясь по гриду - делаю вызов карточки из проги на МиниГуи.

SergKis: Andrey пишет Отдельную прогу под это писать наверное нет смысла и ехе-ник весит порядочно. Да и в добавок есть ещё доп. меню в C# перемещаясь по гриду - делаю вызов карточки из проги на МиниГуи. 1. Делай эту прогу клиентом P.sql (всегда загружена), можешь в tray повесить, данные может получать\создавать в любом удобном формате txt, csv, json, dbf ... Режимы меню остаются в работе (можно в tray определить) 2. Консольная прога или vwt (весят мало) без вывода на экран, создают\получают эти файлы и осуществляет работу с dbfcdx shared. Запуск на run из C# или из hmg. Ведет журнал обмена. 3. Осн. прогр. hmg

SergKis: PS Осн. прогр. hmg должна следить за наличием в памяти клиента C#, т.е. если убрать клиента, например, Task Manager, то клиент должен быть запущен вновь



полная версия страницы