crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как удалить один из скриптовых модулей, Удаление модуля из QScriptEngine
JohnZ
  опции профиля:
сообщение 9.7.2015, 17:44
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Всем Здравия !

Уважаемые форумчане, возникла такая проблема, - в QScriptEngine было добавлено
несколько скриптовых модулей. Каждый модуль обслуживает свою форму, которая
в данный момент видна на экране.
Модуль добавляется стандартно - engine->evaluate(script, name);

Соответственно при закрытии формы, необходимо убрать и её модуль
из QScriptEngine. Подскажите плз, как это можно сделать ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 9.7.2015, 18:20
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Можно попробовать через engine->globalObject() найти свойство, содержащее объект модуля и сделать ему setProperty QScriptValue()
http://doc.qt.io/qt-4.8/qscriptvalue.html#setProperty
Цитата
If value is invalid, the property is removed.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 22.7.2015, 22:12
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


lanz, не получается. В прицепе скрин дебугера, в колонке слева один и тот-же скрипт
столько раз повторен, сколько раз открывался документ. Скрипт добавляется и удаляется так :

// Добавляем скрипт в engine
// lscr содержит скрипт, locScr имя скрипта
locScr = QString("scr%1").arg(ids);
engine->evaluate(lscr, locScr);

...
// Тут формирование и вызов формы
...

//  Вроде как удаление скрипта, но результат можно увидеть в прицепе :(

engine->globalObject().setProperty(locScr, QScriptValue());


Может я не так удаляю его ?

Сообщение отредактировал JohnZ - 22.7.2015, 22:13
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 23.7.2015, 9:21
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Дебаггер показывает скомпилированные скрипты. Естественно, каждый раз когда вы вызываете evaluate, создается новый объект, содержащий скомпилированный код, поскольку неизвестно какому предыдущему объекту соответствует этот код.
Мне кажется, это забота QScriptEngine следить чтобы эти объекты вовремя удалялись. И нет ничего страшного что они некоторое время копятся.
Если хотите чтобы такой объект был только один, используйте
http://doc.qt.io/qt-4.8/qscriptprogram.html#details
и вторую перегрузку
http://doc.qt.io/qt-4.8/qscriptengine.html#evaluate-2
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 23.7.2015, 10:10
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Цитата(lanz @ 23.7.2015, 9:21) *
Дебаггер показывает скомпилированные скрипты. Естественно, каждый раз когда вы вызываете evaluate, создается новый объект, содержащий скомпилированный код, поскольку неизвестно какому предыдущему объекту соответствует этот код.
Мне кажется, это забота QScriptEngine следить чтобы эти объекты вовремя удалялись. И нет ничего страшного что они некоторое время копятся.

В моём случае это как раз и может стать проблемой, т.к. из списка материалов в несколько тыс. сделать N-ное кол-во раз
отчёт по движению (Карточка движения), и все скрипты останутся в "мозгу" у engine :( Ведь зайдя затем в другой отчёт,
он тоже так-же "зависнет" в "мозгу" у engine N-ное кол-во раз. Постоянный скрипт один, он виден на скрине первым,
остальные должны быть приходяще-уходящие, :) в зависимости от контекста.
Может можно эту траблу решить с пом-ю Push/Pop Context ? Совсем топорно делать (пересоздавать engine) не хоц-ца ... Может есть примерчик ?
Цитата
Если хотите чтобы такой объект был только один, используйте
http://doc.qt.io/qt-4.8/qscriptprogram.html#details
и вторую перегрузку
http://doc.qt.io/qt-4.8/qscriptengine.html#evaluate-2

Не подходит, т.к. (полный) скрипт модульный, и формируется динамически в зависимости от выбора юзверя. В разное
время может быть до 5-ти разных модулей, и если они начнут плодиться по закону Фибоначи ... :)

Сообщение отредактировал JohnZ - 23.7.2015, 10:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 23.7.2015, 14:52
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


А вы попробуйте, запустите 10000 скриптов просто в цикле. И посмотрите сколько из них останутся.

Не верю, что ВСЕ скрипты действительно остаются. Это какаято супер-глупая реализация была бы.
Я думаю сборщик мусора их подчищает время от времени.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 23.7.2015, 20:29
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


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

Сообщение отредактировал JohnZ - 23.7.2015, 20:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 24.7.2015, 11:52
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Те имена, что показывает дебаггер, это просто строки, переданные в evaluate.
Насколько я понял из беглого просмотра исходников, Qt использует целочисленные идентификаторы для объектов кода полученных таким образом.
Так что пересечения не должно быть.

Другое дело, если ваши программы создают объекты, определяют функции и тп.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 27.7.2015, 14:52
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Цитата(lanz @ 24.7.2015, 11:52) *
Другое дело, если ваши программы создают объекты, определяют функции и тп.

Да lanz, так и есть. Когда объект создаётся, он сам себя добавляет в engine и свой скрипт и имя в т.ч.
Так проще, т.к. иначе за всеми этими добавлениями нужно было-бы следить и делать главной ветке,
а у неё (MainWindow) своих дел хватает :rolleyes: .

Может в деструкторе объекта как-то можно это безобразие почистить ?

Если в скрипте написано "delete obj;" то должен-ли он удалиться немедленно ?

У меня почему-то не удаляется :( Может нужно ещё что-то сказать мусорщику ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.11.2019, 6:06