cJSON: Рабочие вопросы при работе с классом

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

Добрый день !

Подскажите пожалуйста: можно ли сделать индикацию процесса выполнения
для методов ToGroup / ToQueue и процедур json::CreateObject / json::CreateArray ?

Скорость работы класса нормальная, это вопрос индикации разбора больших данных.
Иначе программа находится некоторое время (минуты) в состоянии подвиса. :(

В общем случае, даже не нужен развёрнутый вариант решения как ParseCallback() ...
Вполне достаточно заполнения PROGRESS,RANGE(0,100), если указана экранная
метка индикатора (в переменной класса или опциональном параметре процедуры).
Как вариант. Спасибо !
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Рабочие вопросы при работе с классом

Сообщение Дед Пахом »

В принципе и сейчас всё для этого есть: можно использовать метод TCJsonRuleHelper.FindCB, он вызывается для каждого поля структуры. Алгоритм видится таким:
- Знаем размер очереди (прогресс=100%)
- В FindCB каждый раз, когда переданное имя совпадает с первым полем структуры, инкрементируем счётчик.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

Дед Пахом писал(а): 09 Январь 2023, 18:45 Алгоритм видится таким:
Игорь всё сделал, но у него смешанное чувство. :dizzy:
Да, индикатор отрабатывает наполовину ... и снова подвисает секунд на 30.
Видимо после разбора TCJsonRuleHelper.FindCB() идёт ещё какая-то обработка ... :(

i.jpg
Вложения
test.zip
(421.69 КБ) 45 скачиваний
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

cJSON: Рабочие вопросы при работе с классом

Сообщение Admin »

Игорь Столяров писал(а): 09 Январь 2023, 23:36 Да, индикатор отрабатывает наполовину ... и снова подвисает секунд на 30.
Первый раз прогресс что то грузит пакет.
Потом заголовок меняется на очередь и градусник нормально до конца пробегает.
Далее окно висит несколько минут... очень медленно что то делается с нагрузкой в 50% проца.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

Admin писал(а): 10 Январь 2023, 5:30 очень медленно что то делается с нагрузкой в 50% проца
У Вас видимо старый релиз класса - сейчас всё быстрей делается. :)
Но конечно, (очень) хотелось бы что бы все вышли из сумрака и показать выполнение процесса загрузки в ToQueue(). ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

cJSON: Рабочие вопросы при работе с классом

Сообщение Admin »

Игорь Столяров писал(а): 10 Январь 2023, 6:40 видимо старый релиз класса
Только утром скачал репу. Надеюсь там свежак.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Рабочие вопросы при работе с классом

Сообщение Дед Пахом »

Игорь Столяров писал(а): 09 Январь 2023, 23:36 Видимо после разбора TCJsonRuleHelper.FindCB() идёт ещё какая-то обработка ..
FindCB не подходит для индикации, надо делать отдельный колбэк.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Рабочие вопросы при работе с классом

Сообщение Дед Пахом »

Пока остановился на таком варианте: колбэк только для обработки массивов, вызывается после добавления записи очереди в json-массив или наоборот, добавления элемента json-массива в очередь. То есть и в json::CreateArray, и в cJSON.ToQueue.

Скачать на нашем ftp: /cjson/1.37.1/

Попутно, есть возможность прервать обработку массива по каким-то причинам, вернув FALSE (см. пример ниже).
Также есть вероятность, что колбэк будет вызван для разных массивов (для случаев очередей в очередях), поэтому передаётся ссылка на обрабатываемый json массив, его можно сравнить с корневым объектом (см. пример ниже).
Параметр pRules передаётся просто так, чтобы как-то оправдать имя класса TCJsonRuleHelper, в котором этот колбэк объявлен.

Декларация:

Код: Выделить всё

rh                CLASS(TCJsonRuleHelper)
ArrayItemCB         PROCEDURE(LONG pArraySize, LONG pCurrentIndex, CONST *cJSON pArray, *typCJsonFieldRules pRules), BOOL, VIRTUAL
                  END
Реализация:

Код: Выделить всё

rh.ArrayItemCB                PROCEDURE(LONG pArraySize, LONG pCurrentIndex, CONST *cJSON pArray, *typCJsonFieldRules pRules)
newPercent                      LONG, AUTO
  CODE
  IF pArray &= Root
    newPercent = (pCurrentIndex * 100 / pArraySize)
    IF newPercent > curPercent
      curPercent = newPercent
      xProgress{Prop:Progress} = curPercent
!      printd('rh.ArrayItemCB(%i, %i): progress %i%%', pArraySize, pCurrentIndex, curPercent)
    END
    
!    !- 100 records limit
!    IF pCurrentIndex = 100
!      RETURN FALSE
!    END
  END
  
  RETURN TRUE
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

Дед Пахом писал(а): 10 Январь 2023, 10:06 есть возможность прервать обработку массива по каким-то причинам
Это очень интересное решение ! :ty:
Попробую с его помощью задушить вывод конструкций типа "array":[1,2,3,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Рабочие вопросы при работе с классом

Сообщение Дед Пахом »

Update ftp: /cjson/1.37.2/

Изменения (вряд ли Вам менять в сотне мест):
1. Поменял имя метода на более соответствующее "ArrayCB".
2. Добавил параметр pQueueInstance, чтобы можно было определить, какая очередь обрабатывается.
3. Добавил вызов колбэка в json::CreateArray(FILE), json::CreateSimpleArray(QUEUE) и cJSON.ToFile(FILE). Не вижу (пока) необходимости добавлять в json::CreateDoubleArray, json::CreateIntArray, json::CreateStringArray.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

Дед Пахом писал(а): 10 Январь 2023, 11:16 json::CreateDoubleArray, json::CreateIntArray, json::CreateStringArray
Это специфические выгрузки - у нас пока не было задачи их задействовать.
А всё остальное - в работу ! :ty:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

Дед Пахом писал(а): 10 Январь 2023, 10:06 rh CLASS(TCJsonRuleHelper)
ArrayCB PROCEDURE(LONG pArraySize, LONG pCurrentIndex, CONST *cJSON pArray, *typCJsonFieldRules pRules), BOOL, VIRTUAL
END
Вообще нет передачи управления в ArrayCB() и очень смущает аттрибут VIRTUAL ...
Последний раз редактировалось Игорь Столяров 10 Январь 2023, 13:49, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

Игорь понял. Всё работает супер ! :ty:

Код: Выделить всё

rh    Class(TCJsonRuleHelper)
ArrayCB Procedure(LONG pArraySize, LONG pCurrentIndex, CONST *cJSON pArray, LONG pQueueInstance, *typCJsonFieldRules pRules), Bool, Derived
      end
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Рабочие вопросы при работе с классом

Сообщение Игорь Столяров »

SOS !!! :shock:
В крайнем релизе отвалилась ВЫГРУЗКА файлов. :(
Если для пустого поля включена опция "IsFile", то программу вышибает конкретно.
Пример прилагаю, посмотрите пожалуйста.
Последний раз редактировалось Игорь Столяров 10 Январь 2023, 20:05, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Рабочие вопросы при работе с классом

Сообщение Дед Пахом »

Если бы Вы попробовали выгрузить реальный файл (например qList:fileinbase64_01 = 'ParseJSON.clw'), то увидели бы, что IsFile прекрасно работает, а дело в json::LoadFile, которую я сломал (возвращает мусор вместо пустой строки, если файл не найден).
Починил, v1.37.3 на FTP.
С уважением, ДП
Ответить