Всем Здравия !
Уважаемые форумчане, возникла такая проблема, - в QScriptEngine было добавлено
несколько скриптовых модулей. Каждый модуль обслуживает свою форму, которая
в данный момент видна на экране.
Модуль добавляется стандартно - engine->evaluate(script, name);
Соответственно при закрытии формы, необходимо убрать и её модуль
из QScriptEngine. Подскажите плз, как это можно сделать ?
Можно попробовать через engine->globalObject() найти свойство, содержащее объект модуля и сделать ему setProperty QScriptValue()
http://doc.qt.io/qt-4.8/qscriptvalue.html#setProperty
lanz, не получается. В прицепе скрин дебугера, в колонке слева один и тот-же скрипт
столько раз повторен, сколько раз открывался документ. Скрипт добавляется и удаляется так :
// Добавляем скрипт в engine
// lscr содержит скрипт, locScr имя скрипта
locScr = QString("scr%1").arg(ids);
engine->evaluate(lscr, locScr);
...
// Тут формирование и вызов формы
...
// Вроде как удаление скрипта, но результат можно увидеть в прицепе :(
engine->globalObject().setProperty(locScr, QScriptValue());
Дебаггер показывает скомпилированные скрипты. Естественно, каждый раз когда вы вызываете evaluate, создается новый объект, содержащий скомпилированный код, поскольку неизвестно какому предыдущему объекту соответствует этот код.
Мне кажется, это забота QScriptEngine следить чтобы эти объекты вовремя удалялись. И нет ничего страшного что они некоторое время копятся.
Если хотите чтобы такой объект был только один, используйте
http://doc.qt.io/qt-4.8/qscriptprogram.html#details
и вторую перегрузку
http://doc.qt.io/qt-4.8/qscriptengine.html#evaluate-2
А вы попробуйте, запустите 10000 скриптов просто в цикле. И посмотрите сколько из них останутся.
Не верю, что ВСЕ скрипты действительно остаются. Это какаято супер-глупая реализация была бы.
Я думаю сборщик мусора их подчищает время от времени.
Проблема в том, что может получиться пересечение имён ф-ций из разных модулей, ес-сно с разной
реализацией. Поэтому необходимо как-то заставить "мусорщика" работать шустрее ...
Те имена, что показывает дебаггер, это просто строки, переданные в evaluate.
Насколько я понял из беглого просмотра исходников, Qt использует целочисленные идентификаторы для объектов кода полученных таким образом.
Так что пересечения не должно быть.
Другое дело, если ваши программы создают объекты, определяют функции и тп.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)