Форум » GUI » TsBrowse и MT » Ответить

TsBrowse и MT

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

Ответов - 24, стр: 1 2 All

SergKis: 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 или еще как ...

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

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


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

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

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

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

SergKis: Haz пишет формирую фоновые отчеты Такой вариант работал с mysql, firebird еще с clipper времен - самый простой и надежный, по мне, с основной программой hmg связывать сообщением

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

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

SergKis: Haz пишет Основной модуль в консоли, принимает , регистрирует и отправляет rest запросы. Похожий вариант у меня работает, только вместо hmg C++ вариант с htmlayout.dll (с 2004 г.) были мысли переделать, но тсб не совсем отвечал потребностям. А с др. стороны большой разницы нет в потоке задачи или в фоновом потоке, а и времени жалко. Оставил как есть. В потоке, в отличие от таймера нужно перехватывать рабочую область Это не обязательно, можно открывать в shared режиме и обновлять базу. На мой взгляд, с тсб надо работать без фильтра и желательно с индексными тегами (scope), для правильной поддержки :nLen иначе вся прорисовка развалится. С filter надо последовательно пробегать по выборке уст. на данный момент, для подсчета :nLen, что не проходит без приостановки работы тсб, т.к. база изменилась, а :nLen в тсб нет (при небольших выборках это быстро будет, но зависит, что выставит клиент в просмотр тсб).

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

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

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

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

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

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

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

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

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

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

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

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

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



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