Автор | Сообщение |
|
| |
Пост N: 1662
Зарегистрирован: 20.02.11
|
|
Отправлено: 23.10.20 19:13. Заголовок: TsBrowse и MT
никто не занимался вопросом работы tsbrowse в отдельном потоке ? сделал Rest сервер для обработки запросов и обмена данными между своей системой 1С7 и Bitrix все в консольке, а монитор к этому серверу рисую в гуях. Через таймер все работает, отслеживается запись нового запроса в базу и tsbrows рисует новую строку не сбивая фокуса в текущей. А вот при попытке уйти от таймера на поток, столкнулся с блокировкой рабочей области, не понимаю куда можно прописать hb_dbdetach()/hb_dbRequest() в tsbrowse чтобы контролирующий поток успешно смог взять эту область , проверить на наличие изменений и вернуть обратно..
|
|
|
Ответов - 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 или еще как ...
|
|
|
|
| |
Пост N: 7252
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.10.20 21:10. Заголовок: Игорь оставь как ест..
Игорь оставь как есть по таймеру Как вариант не использовать функции hb_dbdetach()/hb_dbRequest() а саму базу которую нужно открыть , открывай с другим Alias , сам же учил меня этому "фокусу" под Минигуи
|
|
|
|
| постоянный участник
|
Пост N: 3484
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.10.20 21:20. Заголовок: Haz пишет Через тайм..
Haz пишет цитата: | Через таймер все работает |
| Я бы использовал событие, т.е. поток закончил и послал сообщение окну, по которому окно переотображается
|
|
|
|
| |
Пост N: 1663
Зарегистрирован: 20.02.11
|
|
Отправлено: 23.10.20 22:09. Заголовок: SergKis пишет: запр..
SergKis пишет: цитата: | запросы выполняться в потоках, как написано у А.Кресина |
| идея была именно в том, что бы поймать где-то состояние ожидания в tsb. При ожидании делать detach базы и тогда другой поток сможет выполнить request. Как только происходит какое либо событие с бровсом, сначала отрабатывает request и бровса получает базу в работу. В консольном бровсе есть эта точка - inkey(0) А тут не соображу
|
|
|
|
| |
Пост N: 1664
Зарегистрирован: 20.02.11
|
|
Отправлено: 23.10.20 22:16. Заголовок: Dima пишет: Игорь о..
Dima пишет: цитата: | Игорь оставь как есть по таймеру |
| Дим. Пока так и оставил. Вариант со вторым алиасом тоже прокатит. Просто появилась возможность и решил попытаться. Как вариант такого подхода ( если получится ) это параллельная прорисовка строк бровса в потоках , фоновая проверка кешированных данных в хешах и их синхронизация и пр.
|
|
|
|
| постоянный участник
|
Пост N: 3485
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.10.20 22:24. Заголовок: Haz пишет А тут не с..
Haz пишет Ожидание в системе, обработка очереди сообщений и распределения их по handle окон и далее. С тсб, наверно, делать так, потоки по завершении выдают сообщения о завершении, которые регистрируются на окне или тсб, в тсб проверяешь завершении нескольких запросов, в том же :HandleEvent (:bEvents) или в :bOnDrawLine, xRow == :nRowCount(), последняя строка отображения, посылаем сообщение проверить завершение потоков, возможно еще есть варианты по имеющимся блокам кода, не скажу, т.к. не пробовал такие ваианты
|
|
|
|
| |
Пост N: 1665
Зарегистрирован: 20.02.11
|
|
Отправлено: 23.10.20 22:36. Заголовок: SergKis пишет: т.к...
SergKis пишет: цитата: | т.к. не пробовал такие ваианты |
|
вот и я не пробовал. В понедельник еще немного поэкспериментирую. Регистрировать окончание потоков не подойдёт. Хочу циклить поток и управлять им через мютексы и приостановку. Пока потоки использую для сервиса самого проекта. Проверяю нагрузку на цп запущенным проектом, если процесс подвис -завершаю, формирую фоновые отчеты , отправляю письма по почте и пр . Естественно перед завершением закрываю все потоки и дожидаюсь окончание.
|
|
|
|
| постоянный участник
|
Пост N: 3486
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.10.20 22:45. Заголовок: Haz пишет формирую ф..
Haz пишет Такой вариант работал с mysql, firebird еще с clipper времен - самый простой и надежный, по мне, с основной программой hmg связывать сообщением
|
|
|
|
| постоянный участник
|
Пост N: 3487
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.20 12:24. Заголовок: Haz пишет Регистриро..
Haz пишет цитата: | Регистрировать окончание потоков не подойдёт. Хочу циклить поток и управлять им через мютексы и приостановку. |
| Что делает у тебя поток, снимок значений с базы полный или подкачку данных, к примеру, по 20 строк ? Цепляться можно в :bEvents реагируя на WM_...сообщения нажатия клавиш, мыши ... для запуска работы запроса в потоке и анализа завершения запроса в потоке (через посылку сообщений окну\тсб)
|
|
|
|
| |
Пост N: 1666
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.10.20 15:43. Заголовок: SergKis пишет: Что ..
SergKis пишет: цитата: | Что делает у тебя поток, снимок значений с базы полный или подкачку данных, к примеру, по 20 строк ? |
| Основной модуль в консоли, принимает , регистрирует и отправляет rest запросы. Все это в этом модуле протоколируется в базу ( кто обратился, чего и от кого хотел и кому отправить ответ в виде того же rest ). В консольке поскольку запускается еще до инициализации пользователей на серваке и графики. Второй модуль на минигуи , просто отображает эту историю из той базы, позволяет сортировать, искать и фильтровать по адресам local и remote. Также по параметрам строки запроса ( user agent, URI , method ). В базе так же хранятся jSon обращения и ответа и по ним тоже возможен поиск . Поскольку не хочу сбивать навигацию по бровсу в минигуи , пока сделал на таймере анализ появления новых запросов в базе и их добавление в бровс на фоне не мешая оператору. То есть в момент добавления оператор может искать анализировать готовить отчет и все это независимо. Вот эту логику хотел из таймера перенести в поток. В потоке, в отличие от таймера нужно перехватывать рабочую область т. к. основной процесс при этом не приостанавливается как с таймером. Идея чтоб вне зависимости от сложности обработки в потоке основной бровса не фризился . то есть оператор не должен замечать что он управляет бровсом не один
|
|
|
|
| постоянный участник
|
Пост N: 3488
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.20 20:30. Заголовок: Haz пишет Основной м..
Haz пишет цитата: | Основной модуль в консоли, принимает , регистрирует и отправляет rest запросы. |
| Похожий вариант у меня работает, только вместо hmg C++ вариант с htmlayout.dll (с 2004 г.) были мысли переделать, но тсб не совсем отвечал потребностям. А с др. стороны большой разницы нет в потоке задачи или в фоновом потоке, а и времени жалко. Оставил как есть. цитата: | В потоке, в отличие от таймера нужно перехватывать рабочую область |
| Это не обязательно, можно открывать в shared режиме и обновлять базу. На мой взгляд, с тсб надо работать без фильтра и желательно с индексными тегами (scope), для правильной поддержки :nLen иначе вся прорисовка развалится. С filter надо последовательно пробегать по выборке уст. на данный момент, для подсчета :nLen, что не проходит без приостановки работы тсб, т.к. база изменилась, а :nLen в тсб нет (при небольших выборках это быстро будет, но зависит, что выставит клиент в просмотр тсб).
|
|
|
|
|
| |
Пост 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 на время прыжка и прорисовки строки, тогда блокировку области можно не делать. Поупражняюсь в понедельник. Не получится оставлю на таймере.
|
|
|
|
| постоянный участник
|
Пост N: 3489
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.20 22:52. Заголовок: Haz пишет поток не с..
Haz пишет цитата: | поток не сможет гарантировать что вернул указатель на место |
| Так он и не должен это делать, в потоке открыли повторно базу, внесли изменения, закрыли, но здесь большая бяка, тсб надо приостанавливать, т.к. :nLen в тсб старый, а клиент перемещает изображение, может тсб развалиться. LastRec() не все решает, т.к. еще есть set deleted on. Все таки тсб - это работа со снимком базы, возможно в потоке повторный отбор (снимок) с новым алиасом и подмена его более подходит. С передачей алиаса потоку через zero space, тоже мало помогает, т.к. подразумевает откл. алиаса от тсб, работа в потоке и возврат в тсб, т.е. приостанавливаем работу тсб в любом случае. Получается "хрен редьки не слаще"
|
|
|
|
| постоянный участник
|
Пост N: 3490
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.20 22:57. Заголовок: PS Потому делаю кноп..
PS Потому делаю кнопку Refresh и по ней получаю изменения, включаю в просмотр тсб с учетом filter ставим :nLen и тсб отключено на это время. Надо клиенту уточнить выборку на данную минуту жмет Refresh
|
|
|
|
| |
Пост N: 1668
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.10.20 23:01. Заголовок: SergKis пишет: с но..
SergKis пишет: цитата: | с новым алиасом и подмена его более подходит. |
|
Вот это и хочу в понедельник проверить. Подмена работает нормально, ранее много где использовал. И без блокировки можно обойтись.
|
|
|
|
| постоянный участник
|
Пост N: 3491
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.20 23:24. Заголовок: Haz пишет Вот это и ..
Haz пишет цитата: | Вот это и хочу в понедельник проверить. Подмена работает нормально, ранее много где использовал. И без блокировки можно обойтись. |
| По идее, все должно работать, только в таком варианте надо иметь механизм знания, что база изменилась, инче замучаешь сервер пустыми запросами
|
|
|
|
| постоянный участник
|
Пост N: 3492
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.10.20 19:00. Заголовок: Haz пишет Вот это и ..
Haz пишет цитата: | Вот это и хочу в понедельник проверить. Подмена работает нормально, ранее много где использовал. И без блокировки можно обойтись |
| Игорь, как успехи ?
|
|
|
|
| |
Пост N: 1669
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.10.20 19:49. Заголовок: SergKis пишет: Игор..
SergKis пишет: Сергей привет. С подменой ::cAlias на открытый в потоке работает нормально, сам бровс наследуется в поток как public. Для текущей задачи - отображать журнал подключений функционала хватает, но это своеобразный хак работы с базой в потоке. Завтра попробую даже не менять, а открывать в потоке с тем же алиасом, по идее коллизий не должно быть , просто по номеру текущей записи синхронизации достаточно
|
|
|
|
| |
Пост N: 1670
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.10.20 14:44. Заголовок: Haz пишет: Завтра п..
Haz пишет: цитата: | Завтра попробую даже не менять, а открывать в потоке с тем же алиасом |
| В общем в потоке можно открывать базу с тем же алиасом, основной процесс и поток друг другу не мешают, ничего подменять тогда не надо. Бровс легко управляется из потока как public объект
|
|
|
|
| постоянный участник
|
Пост N: 3493
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.10.20 17:47. Заголовок: Haz пишет В общем в ..
Haz пишет цитата: | В общем в потоке можно открывать базу с тем же алиасом, основной процесс и поток друг другу не мешают, ничего подменять тогда не надо. Бровс легко управляется из потока как public объект |
| Т.е. ты создав окно с пустым тсб уходишь в запрос в потоке и в нем показываешь результат из потока в public переданной oBrw (периодически повторяешь выполнение запроса в потоке) подвешивая его на мутексах в ожидание ? Правильно понимаю ?
|
|
|
|
| |
Пост N: 1671
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.10.20 19:27. Заголовок: SergKis пишет: Т.е...
SergKis пишет: цитата: | Т.е. ты создав окно с пустым тсб уходишь |
| не совсем. 1) ТСБ создается и функционирует в основном процессе по алиасу "А1" 2) создается поток в котором так же открывается алиас "А1" и зацикливается с задержкой sleep поскольку алиасы разделены потоком, они друг друга не видят и не мешают , а ТСБ работает по имени не зная где он в конкретный момент ( в основном процессе или в потоке ) 3) в цикле потока пока отслеживается появление новых записей в базе и нужно ли это отображать на ТСБ. если нужно то в потоке идет корректировка ::nLen и дорисовка строки . При этом фокус ввода на самом ТСБ визуально не меняется и не моргает. Технически даже в основном процессе может выполняться редактирование ячейки и это не помешает потоку дорисовать строку. мютексы пока не использовал, т.к. нет разделяемого ресурса ( да и не задать его в ТСБ нет такого места где у ТСБ режим ожидания ) , но возможно появится по мере усложнения логики. главное опробовал механизм работы с ТСБ и одним именем алиаса
|
|
|
|
|
| постоянный участник
|
Пост N: 3494
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.10.20 21:04. Заголовок: Haz пишет 3) в цикле..
Haz пишет цитата: | 3) в цикле потока пока отслеживается появление новых записей в базе и нужно ли это отображать на ТСБ. если нужно то в потоке идет корректировка ::nLen и дорисовка строки |
| Т.е. ты переносишь изменения в основной алиас по oBrw и меняешь :nLen ? Или в потоке с тем же алиасом весь отбор показываешь, синхронизируя по тек. записи ? Это место не очень понял.
|
|
|
|
| |
Пост N: 1672
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.10.20 21:39. Заголовок: SergKis пишет: Т.е...
SergKis пишет: цитата: | Т.е. ты переносишь изменения в основной алиас по oBrw и меняешь :nLen ? |
| база пополняется новыми записями из консольного сервера. монитор и настройки сделаны в гуи. Простейший монитор это окошко и тсб на нем, но нужно постоянно обновлять чтобы видеть новую статистику. Поэтому решил обновление отдать потоку. В потоке анализируется появление новых записей и есть ли место в бровсе где показать новую запись, если и то и то есть, поток пересчитывает ::nLen и рисует строчку в ТСБ. Визуально это выглядит примерно так В бровсе 3 строки , курсор на строке 2 за курсором еще одна и дальше пусто ( всего пусть помещается 20 ). В какой-то момент курсор по прежнему на строке 2 , но появляется строка 4 , затем 5. При этом можно осуществлять навигацию по ТСБ и это не мешает появлению новых строк. Когда будут заполнены все 20 строк , поток работает в холостую и не рисует больше ничего. Пока сделано так. Изменения в основной алиас не переношу , они там и так есть т.к база в SHARED , поток просто мониторит нужно ли дорисовать строчку. Как вариант - совместная работа, курсор на строке 2 ( или редактируешь ее ) и в реальном видишь как меняются ячейки в других строках ( те что меняют другие пользователи )
|
|
|
|
| постоянный участник
|
Пост N: 3495
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.10.20 22:43. Заголовок: Haz пишет база попол..
Haz пишет цитата: | база пополняется новыми записями из консольного сервера. |
| Теперь понял, у тебя 3и источника. Но наверно, можно обойтись одним потоком в дальнейшем.
|
|
|
Ответов - 24
, стр:
1
2
All
[только новые]
|
|