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




Пост N: 1662
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.10.20 19:13. Заголовок: TsBrowse и MT


никто не занимался вопросом работы tsbrowse в отдельном потоке ?
сделал Rest сервер для обработки запросов и обмена данными между своей системой 1С7 и Bitrix все в консольке, а монитор к этому серверу рисую в гуях.
Через таймер все работает, отслеживается запись нового запроса в базу и tsbrows рисует новую строку не сбивая фокуса в текущей.
А вот при попытке уйти от таймера на поток, столкнулся с блокировкой рабочей области, не понимаю куда можно прописать hb_dbdetach()/hb_dbRequest() в tsbrowse чтобы контролирующий поток успешно смог взять эту область , проверить на наличие изменений и вернуть обратно..

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


постоянный участник




Пост N: 3483
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.10.20 21:03. Заголовок: Haz пишет никто не з..


Haz пишет
 цитата:
никто не занимался вопросом работы tsbrowse в отдельном потоке ?


Посмотрел немного в сторону потоков, на примере Tsb_DemoMdi, основная проблема в public HMG_... переменных контролов и окон, тсб часть эти переменных. Т.е. думаю, работа окон должна быть в основном потоке, а запросы выполняться в потоках, как написано у А.Кресина
 цитата:

#xcommand UNLOCK WORKAREA [] => hb_dbDetach( )
#xcommand LOCK WORKAREA => hb_dbRequest( , .T.,, .T. )
...
LOCK WORKAREA "DOCUMENTS"
COUNT TO nInvoices FOR year( DOCUMENTS->DATE ) == year( date() )
UNLOCK WORKAREA
...


и пробовать подменять oBrw:cAlias или данные в FastDrawCell или еще как ...

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




Пост N: 7252
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.10.20 21:10. Заголовок: Игорь оставь как ест..


Игорь оставь как есть по таймеру
Как вариант не использовать функции hb_dbdetach()/hb_dbRequest() а саму базу которую
нужно открыть , открывай с другим Alias , сам же учил меня этому "фокусу" под Минигуи

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




Пост N: 3484
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.10.20 21:20. Заголовок: Haz пишет Через тайм..


Haz пишет
 цитата:
Через таймер все работает


Я бы использовал событие, т.е. поток закончил и послал сообщение окну, по которому окно переотображается

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




Пост N: 1663
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.10.20 22:09. Заголовок: SergKis пишет: запр..


SergKis пишет:

 цитата:
запросы выполняться в потоках, как написано у А.Кресина


идея была именно в том, что бы поймать где-то состояние ожидания в tsb. При ожидании делать detach базы и тогда другой поток сможет выполнить request. Как только происходит какое либо событие с бровсом, сначала отрабатывает request и бровса получает базу в работу. В консольном бровсе есть эта точка - inkey(0) А тут не соображу

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




Пост N: 1664
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.10.20 22:16. Заголовок: Dima пишет: Игорь о..


Dima пишет:

 цитата:
Игорь оставь как есть по таймеру


Дим. Пока так и оставил. Вариант со вторым алиасом тоже прокатит. Просто появилась возможность и решил попытаться. Как вариант такого подхода ( если получится ) это параллельная прорисовка строк бровса в потоках , фоновая проверка кешированных данных в хешах и их синхронизация и пр.

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




Пост N: 3485
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.10.20 22:24. Заголовок: Haz пишет А тут не с..


Haz пишет
 цитата:
А тут не соображу


Ожидание в системе, обработка очереди сообщений и распределения их по handle окон и далее.
С тсб, наверно, делать так, потоки по завершении выдают сообщения о завершении, которые регистрируются на окне или тсб, в тсб проверяешь завершении нескольких запросов, в том же :HandleEvent (:bEvents) или в :bOnDrawLine, xRow == :nRowCount(), последняя строка отображения, посылаем сообщение проверить завершение потоков, возможно еще есть варианты по имеющимся блокам кода, не скажу, т.к. не пробовал такие ваианты

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




Пост N: 1665
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.10.20 22:36. Заголовок: SergKis пишет: т.к...


SergKis пишет:

 цитата:
т.к. не пробовал такие ваианты

вот и я не пробовал. В понедельник еще немного поэкспериментирую. Регистрировать окончание потоков не подойдёт. Хочу циклить поток и управлять им через мютексы и приостановку.
Пока потоки использую для сервиса самого проекта. Проверяю нагрузку на цп запущенным проектом, если процесс подвис -завершаю, формирую фоновые отчеты , отправляю письма по почте и пр . Естественно перед завершением закрываю все потоки и дожидаюсь окончание.

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




Пост N: 3486
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.10.20 22:45. Заголовок: Haz пишет формирую ф..


Haz пишет
 цитата:
формирую фоновые отчеты


Такой вариант работал с mysql, firebird еще с clipper времен - самый простой и надежный, по мне, с основной программой hmg связывать сообщением

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




Пост N: 3487
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.10.20 12:24. Заголовок: Haz пишет Регистриро..


Haz пишет
 цитата:
Регистрировать окончание потоков не подойдёт. Хочу циклить поток и управлять им через мютексы и приостановку.


Что делает у тебя поток, снимок значений с базы полный или подкачку данных, к примеру, по 20 строк ?
Цепляться можно в :bEvents реагируя на WM_...сообщения нажатия клавиш, мыши ... для запуска работы запроса в потоке и анализа завершения запроса в потоке (через посылку сообщений окну\тсб)

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




Пост N: 1666
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.10.20 15:43. Заголовок: SergKis пишет: Что ..


SergKis пишет:

 цитата:
Что делает у тебя поток, снимок значений с базы полный или подкачку данных, к примеру, по 20 строк ?


Основной модуль в консоли, принимает , регистрирует и отправляет rest запросы. Все это в этом модуле протоколируется в базу ( кто обратился, чего и от кого хотел и кому отправить ответ в виде того же rest ). В консольке поскольку запускается еще до инициализации пользователей на серваке и графики. Второй модуль на минигуи , просто отображает эту историю из той базы, позволяет сортировать, искать и фильтровать по адресам local и remote. Также по параметрам строки запроса ( user agent, URI , method ). В базе так же хранятся jSon обращения и ответа и по ним тоже возможен поиск .
Поскольку не хочу сбивать навигацию по бровсу в минигуи , пока сделал на таймере анализ появления новых запросов в базе и их добавление в бровс на фоне не мешая оператору. То есть в момент добавления оператор может искать анализировать готовить отчет и все это независимо.
Вот эту логику хотел из таймера перенести в поток. В потоке, в отличие от таймера нужно перехватывать рабочую область т. к. основной процесс при этом не приостанавливается как с таймером. Идея чтоб вне зависимости от сложности обработки в потоке основной бровса не фризился . то есть оператор не должен замечать что он управляет бровсом не один

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




Пост N: 3488
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.10.20 20:30. Заголовок: Haz пишет Основной м..


Haz пишет
 цитата:
Основной модуль в консоли, принимает , регистрирует и отправляет rest запросы.


Похожий вариант у меня работает, только вместо hmg C++ вариант с htmlayout.dll (с 2004 г.) были мысли переделать, но тсб не совсем отвечал потребностям. А с др. стороны большой разницы нет в потоке задачи или в фоновом потоке, а и времени жалко. Оставил как есть.

 цитата:
В потоке, в отличие от таймера нужно перехватывать рабочую область


Это не обязательно, можно открывать в shared режиме и обновлять базу. На мой взгляд, с тсб надо работать без фильтра и желательно с индексными тегами (scope), для правильной поддержки :nLen иначе вся прорисовка развалится. С filter надо последовательно пробегать по выборке уст. на данный момент, для подсчета :nLen, что не проходит без приостановки работы тсб, т.к. база изменилась, а :nLen в тсб нет (при небольших выборках это быстро будет, но зависит, что выставит клиент в просмотр тсб).

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




Пост N: 1667
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.10.20 21:05. Заголовок: SergKis пишет: Это ..


SergKis пишет:

 цитата:
Это не обязательно, можно открывать в shared


Все в shared , a блокировка обязательна . т. к. После прорисовки новой строки и корректировки ::nLen поток не сможет гарантировать что вернул указатель на место.
В потоке drawline() по новой nRowpos() пока происходит. То есть поток проверяет nLen и Lestrec() на соответствие и если Lastrec() больше, то корректируетn nLen и рисует новую строку внизу ( если это не nRowCount. Для прорисовки нужно прыгнуть на последнюю запись, а после вернуться на прежнюю. Вот этот прыжок и критичен для бровса и его не сделать не залочив область в потоке. На втором алиасе получится сделать только подменив на него oBrw:cAlias на время прыжка и прорисовки строки, тогда блокировку области можно не делать.
Поупражняюсь в понедельник. Не получится оставлю на таймере.

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




Пост N: 3489
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.10.20 22:52. Заголовок: Haz пишет поток не с..


Haz пишет
 цитата:
поток не сможет гарантировать что вернул указатель на место


Так он и не должен это делать, в потоке открыли повторно базу, внесли изменения, закрыли, но здесь большая бяка, тсб надо приостанавливать, т.к. :nLen в тсб старый, а клиент перемещает изображение, может тсб развалиться. LastRec() не все решает, т.к. еще есть set deleted on. Все таки тсб - это работа со снимком базы, возможно в потоке повторный отбор (снимок) с новым алиасом и подмена его более подходит.
С передачей алиаса потоку через zero space, тоже мало помогает, т.к. подразумевает откл. алиаса от тсб, работа в потоке и возврат в тсб, т.е. приостанавливаем работу тсб в любом случае. Получается "хрен редьки не слаще"

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




Пост N: 3490
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.10.20 22:57. Заголовок: PS Потому делаю кноп..


PS
Потому делаю кнопку Refresh и по ней получаю изменения, включаю в просмотр тсб с учетом filter ставим :nLen и тсб отключено на это время. Надо клиенту уточнить выборку на данную минуту жмет Refresh

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




Пост N: 1668
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.10.20 23:01. Заголовок: SergKis пишет: с но..


SergKis пишет:

 цитата:
с новым алиасом и подмена его более подходит.

Вот это и хочу в понедельник проверить. Подмена работает нормально, ранее много где использовал. И без блокировки можно обойтись.

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




Пост N: 3491
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.10.20 23:24. Заголовок: Haz пишет Вот это и ..


Haz пишет
 цитата:
Вот это и хочу в понедельник проверить. Подмена работает нормально, ранее много где использовал. И без блокировки можно обойтись.


По идее, все должно работать, только в таком варианте надо иметь механизм знания, что база изменилась, инче замучаешь сервер пустыми запросами

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




Пост N: 3492
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.10.20 19:00. Заголовок: Haz пишет Вот это и ..


Haz пишет
 цитата:
Вот это и хочу в понедельник проверить. Подмена работает нормально, ранее много где использовал. И без блокировки можно обойтись


Игорь, как успехи ?

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




Пост N: 1669
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.10.20 19:49. Заголовок: SergKis пишет: Игор..


SergKis пишет:

 цитата:
Игорь, как успехи ?


Сергей привет. С подменой ::cAlias на открытый в потоке работает нормально, сам бровс наследуется в поток как public. Для текущей задачи - отображать журнал подключений функционала хватает, но это своеобразный хак работы с базой в потоке. Завтра попробую даже не менять, а открывать в потоке с тем же алиасом, по идее коллизий не должно быть , просто по номеру текущей записи синхронизации достаточно

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




Пост N: 1670
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.10.20 14:44. Заголовок: Haz пишет: Завтра п..


Haz пишет:

 цитата:
Завтра попробую даже не менять, а открывать в потоке с тем же алиасом


В общем в потоке можно открывать базу с тем же алиасом, основной процесс и поток друг другу не мешают, ничего подменять тогда не надо. Бровс легко управляется из потока как public объект

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




Пост N: 3493
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.10.20 17:47. Заголовок: Haz пишет В общем в ..


Haz пишет
 цитата:
В общем в потоке можно открывать базу с тем же алиасом, основной процесс и поток друг другу не мешают, ничего подменять тогда не надо. Бровс легко управляется из потока как public объект


Т.е. ты создав окно с пустым тсб уходишь в запрос в потоке и в нем показываешь результат из потока в public переданной oBrw (периодически повторяешь выполнение запроса в потоке) подвешивая его на мутексах в ожидание ? Правильно понимаю ?

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




Пост N: 1671
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.10.20 19:27. Заголовок: SergKis пишет: Т.е...


SergKis пишет:

 цитата:
Т.е. ты создав окно с пустым тсб уходишь


не совсем.
1) ТСБ создается и функционирует в основном процессе по алиасу "А1"
2) создается поток в котором так же открывается алиас "А1" и зацикливается с задержкой sleep
поскольку алиасы разделены потоком, они друг друга не видят и не мешают , а ТСБ работает по имени не зная где он в конкретный момент ( в основном процессе или в потоке )
3) в цикле потока пока отслеживается появление новых записей в базе и нужно ли это отображать на ТСБ. если нужно то в потоке идет корректировка ::nLen и дорисовка строки . При этом фокус ввода на самом ТСБ визуально не меняется и не моргает. Технически даже в основном процессе может выполняться редактирование ячейки и это не помешает потоку дорисовать строку.
мютексы пока не использовал, т.к. нет разделяемого ресурса ( да и не задать его в ТСБ нет такого места где у ТСБ режим ожидания ) , но возможно появится по мере усложнения логики.

главное опробовал механизм работы с ТСБ и одним именем алиаса

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




Пост N: 3494
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.10.20 21:04. Заголовок: Haz пишет 3) в цикле..


Haz пишет
 цитата:
3) в цикле потока пока отслеживается появление новых записей в базе и нужно ли это отображать на ТСБ. если нужно то в потоке идет корректировка ::nLen и дорисовка строки


Т.е. ты переносишь изменения в основной алиас по oBrw и меняешь :nLen ?
Или в потоке с тем же алиасом весь отбор показываешь, синхронизируя по тек. записи ?
Это место не очень понял.

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




Пост N: 1672
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.10.20 21:39. Заголовок: SergKis пишет: Т.е...


SergKis пишет:

 цитата:
Т.е. ты переносишь изменения в основной алиас по oBrw и меняешь :nLen ?



база пополняется новыми записями из консольного сервера.
монитор и настройки сделаны в гуи. Простейший монитор это окошко и тсб на нем, но нужно постоянно обновлять чтобы видеть новую статистику. Поэтому решил обновление отдать потоку.
В потоке анализируется появление новых записей и есть ли место в бровсе где показать новую запись, если и то и то есть, поток пересчитывает ::nLen и рисует строчку в ТСБ. Визуально это выглядит примерно так
В бровсе 3 строки , курсор на строке 2 за курсором еще одна и дальше пусто ( всего пусть помещается 20 ). В какой-то момент курсор по прежнему на строке 2 , но появляется строка 4 , затем 5. При этом можно осуществлять навигацию по ТСБ и это не мешает появлению новых строк. Когда будут заполнены все 20 строк , поток работает в холостую и не рисует больше ничего. Пока сделано так.
Изменения в основной алиас не переношу , они там и так есть т.к база в SHARED , поток просто мониторит нужно ли дорисовать строчку. Как вариант - совместная работа, курсор на строке 2 ( или редактируешь ее ) и в реальном видишь как меняются ячейки в других строках ( те что меняют другие пользователи )

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




Пост N: 3495
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.10.20 22:43. Заголовок: Haz пишет база попол..


Haz пишет
 цитата:
база пополняется новыми записями из консольного сервера.


Теперь понял, у тебя 3и источника. Но наверно, можно обойтись одним потоком в дальнейшем.

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

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