On-line: PSP, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 6968
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.06.21 18:47. Заголовок: Работа с базой в потоках


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 11 [только новые]


администратор




Пост N: 7387
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.06.21 19:16. Заголовок: Отдельный поток , Sh..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1695
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.06.21 19:18. Заголовок: Andrey пишет: Конфл..


Andrey пишет:

 цитата:
Конфликт однако...

Какой конфликт ? а блокировка записи и протокол ? В потоке поучил и сохранил в журнал. Потом в потоке разгребаем журнал, открыв рабочую базу с другим алиасом в шаре. все что удалось записать подчищаем в журнале, там где нарвались на блокировку - в следующий раз ( по таймеру к примеру)

Дима опередил

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



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6970
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.06.21 21:52. Заголовок: Haz пишет: Какой ко..


Haz пишет:

 цитата:
Какой конфликт ? а блокировка записи и протокол ? В потоке поучил и сохранил в журнал. Потом в потоке разгребаем журнал, открыв рабочую базу с другим алиасом в шаре. все что удалось записать подчищаем в журнале, там где нарвались на блокировку - в следующий раз ( по таймеру к примеру)


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7390
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.06.21 22:17. Заголовок: Andrey пишет: Тогда..


Andrey пишет:

 цитата:
Тогда создаю отдельный поток и не нужно открывать заново базу заявок, она уже открыта.



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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1697
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.06.21 23:59. Заголовок: Andrey пишет: и не ..


Andrey пишет:

 цитата:
и не нужно открывать заново базу заявок, она уже открыта.

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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1698
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.06.21 11:50. Заголовок: Dima пишет: Да ладн..


Dima пишет:

 цитата:
Да ладно....


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3757
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.21 12:04. Заголовок: Andrey пишет Вопрос ..


Andrey пишет
 цитата:
Вопрос такой как лучше это сделать в текущем потоке или создать новый поток ?


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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# перемещаясь по гриду - делаю вызов карточки из проги на МиниГуи.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3759
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.21 18:46. Заголовок: PS Осн. прогр. hmg д..


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 203
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет