Автор | Сообщение |
|
| постоянный участник
|
Пост N: 6968
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.06.21 18:47. Заголовок: Работа с базой в потоках
Получаю данные у себя в проге на Минигуи из программы на C# с помощью GETMESSAGEDATA() Далее эти данные нужно записать в открытую базу данных, там не много 4-5 полей всего. Вопрос такой как лучше это сделать в текущем потоке или создать новый поток ? Допустим юзер сидит в другой базе и правит запись, а тут приходит SendMessage() из другой программы и пишет в свою базу. Конфликт однако... Как лучше сделать ?
|
|
|
Ответов - 11
[только новые]
|
|
|
| |
Пост N: 7387
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.06.21 19:16. Заголовок: Отдельный поток , Sh..
Отдельный поток , Shared mode и новый Alias для этой базы
|
|
|
|
| |
Пост N: 1695
Зарегистрирован: 20.02.11
|
|
Отправлено: 08.06.21 19:18. Заголовок: Andrey пишет: Конфл..
Andrey пишет: Какой конфликт ? а блокировка записи и протокол ? В потоке поучил и сохранил в журнал. Потом в потоке разгребаем журнал, открыв рабочую базу с другим алиасом в шаре. все что удалось записать подчищаем в журнале, там где нарвались на блокировку - в следующий раз ( по таймеру к примеру) Дима опередил цитата: | Отдельный поток , Shared mode и новый Alias для этой базы |
|
|
|
|
|
| постоянный участник
|
Пост N: 6970
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.06.21 21:52. Заголовок: Haz пишет: Какой ко..
Haz пишет: цитата: | Какой конфликт ? а блокировка записи и протокол ? В потоке поучил и сохранил в журнал. Потом в потоке разгребаем журнал, открыв рабочую базу с другим алиасом в шаре. все что удалось записать подчищаем в журнале, там где нарвались на блокировку - в следующий раз ( по таймеру к примеру) |
| Может и неправильно объяснил. Юзер сидит в базе Договоров и правит запись. Тут приходит SendMessage() из 10 записей, которые нужно записать в базу Заявок. Сама база уже открыта с нужным ключом. Тогда создаю отдельный поток и не нужно открывать заново базу заявок, она уже открыта. Просто записываю эти 10 заявок и закрываю поток. Можно же так ? Правда, да остаётся блокировка записи заявок, если вдруг кто-то правит эту запись. Тогда наверное эту запись в Public массив и обрабатывать этот Public массив в следующий раз по таймеру или при следующем SendMessage(). Вот примерно так мыслю.
|
|
|
|
| |
Пост N: 7390
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.06.21 22:17. Заголовок: Andrey пишет: Тогда..
Andrey пишет: цитата: | Тогда создаю отдельный поток и не нужно открывать заново базу заявок, она уже открыта. |
| Тебе ведь написали как сделать корректно. Пока ты соберешься туда писать , юзер может базу уже закрыть и писать ты будешь на деревню к бабушке и снова чекать свой error.log а почему же упало то
|
|
|
|
| |
Пост N: 1697
Зарегистрирован: 20.02.11
|
|
Отправлено: 08.06.21 23:59. Заголовок: Andrey пишет: и не ..
Andrey пишет: цитата: | и не нужно открывать заново базу заявок, она уже открыта. |
|
в многопоточке невозможно в один единственный алиас писать или читать с разных потоков одновременно. Если юзер открыл базу в Алисе, то для работы из другого потока с этим алиасом у юзера придётся ее забрать . Почитай доки Кресина А. там доступно написано и с примерами. Работать с базой можно по очереди в потоках через зеро Спейс или в каждом потоке открывать в шаре. В твоем случае только в шаре. Сохранение данных в массиве – это предпосылка к потере данных в случае неуспеха записи при блокировке и когда пользователь закрыл программу. Ведёшь в локальной базе журнал, и по мере записи удаляешь из журнала. Даже если рухнет питание всегда будешь знать что не успел из полученного записать
|
|
|
|
| |
Пост N: 7391
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.06.21 11:26. Заголовок: Haz пишет: в многоп..
Haz пишет: цитата: | в многопоточке невозможно в один единственный алиас писать или читать с разных потоков одновременно |
| Да ладно.... Haz пишет: цитата: | В общем в потоке можно открывать базу с тем же алиасом, основной процесс и поток друг другу не мешают, ничего подменять тогда не надо. Бровс легко управляется из потока как public объект |
| http://clipper.borda.ru/?1-1-0-00000594-000-10001-0-1603914204
|
|
|
|
| |
Пост N: 1698
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.06.21 11:50. Заголовок: Dima пишет: Да ладн..
Dima пишет: Я говорил ЕДИНСТВЕННЫЙ ( один и тот же ). В том что ты процитировал их два, пусть и с одинаковым именем. По сути это две разные рабочие области. Не стал Андрея грузить этим фокусом, чтоб не запутать окончательно. Если коротко , в потоках рабочие области изолированы и видны только в самом потоке, поэтому не принципиально каким именем-алиасом обозвать область если ее не передавать из потока в поток. конфликт имен алиасов возникнет только если из одного потока алиас передать в зеро, а потом подключить к другому потоку где этот алиас уже использовался в качестве имени рабочей области
|
|
|
|
| постоянный участник
|
Пост N: 3757
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.21 12:04. Заголовок: Andrey пишет Вопрос ..
Andrey пишет цитата: | Вопрос такой как лучше это сделать в текущем потоке или создать новый поток ? |
| По мне лучше работать в фоне, т.е. сделать отд. клиента (консоль, vwt) для работы с P.sql, т.к. ты вынул из hmg работу с P.sql в C#, то тебе надо как то управлять этой прогой, запускать\останавливать или она запускает клиента для внесения изменений в базу (это ты лучше знаешь кто главный). Нагружать основную прогу hmg алгоритмами с потоками (с обработкой журналов), по мне лишнее. Вдруг понадобится не P.sql, а Mysql ?
|
|
|
|
| постоянный участник
|
Пост N: 6971
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.21 17:06. Заголовок: SergKis пишет: т.е...
SergKis пишет: цитата: | т.е. сделать отд. клиента (консоль, vwt) для работы с P.sql, т.к. ты вынул из hmg работу с P.sql в C#, то тебе надо как то управлять этой прогой, запускать\останавливать или она запускает клиента для внесения изменений в базу (это ты лучше знаешь кто главный). Нагружать основную прогу hmg алгоритмами с потоками (с обработкой журналов), по мне лишнее. |
| Работа с PostgreSQL (в части только чтения из инета) выкинута из основной проги и перенесена в отдельную прогу на C# Прога на C# читает каждые 5-10 минут базу в инете и передаёт записи подвергшие правке за сегодня в мою прогу через SendMessage(), а дальше я сам эти записи пишу в основную базу. Вот и спрашивал как писать лучше, чтобы не нагружать свою основную прогу. Из C# нет возможности писать в dbf новой структуры Харбора, нет возможности работы с индексом CDX. Если кто подскажет, буду очень признателен Из-за этого приходиться пользоваться передачей данных между программами через SendMessage(). Отдельную прогу под это писать наверное нет смысла и ехе-ник весит порядочно. Да и в добавок есть ещё доп. меню в C# перемещаясь по гриду - делаю вызов карточки из проги на МиниГуи.
|
|
|
|
| постоянный участник
|
Пост N: 3758
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.21 18:29. Заголовок: Andrey пишет Отдельн..
Andrey пишет цитата: | Отдельную прогу под это писать наверное нет смысла и ехе-ник весит порядочно. Да и в добавок есть ещё доп. меню в C# перемещаясь по гриду - делаю вызов карточки из проги на МиниГуи. |
| 1. Делай эту прогу клиентом P.sql (всегда загружена), можешь в tray повесить, данные может получать\создавать в любом удобном формате txt, csv, json, dbf ... Режимы меню остаются в работе (можно в tray определить) 2. Консольная прога или vwt (весят мало) без вывода на экран, создают\получают эти файлы и осуществляет работу с dbfcdx shared. Запуск на run из C# или из hmg. Ведет журнал обмена. 3. Осн. прогр. hmg
|
|
|
|
| постоянный участник
|
Пост N: 3759
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.21 18:46. Заголовок: PS Осн. прогр. hmg д..
PS Осн. прогр. hmg должна следить за наличием в памяти клиента C#, т.е. если убрать клиента, например, Task Manager, то клиент должен быть запущен вновь
|
|
|
|