Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: SASA от Сентябрь 12, 2008, 19:49



Название: "Умные" переменные в срипте
Отправлено: SASA от Сентябрь 12, 2008, 19:49
Здравствуйте.
Появилась необходимость добавить в скриптИнжин переменную, и отслеживать её изменение. Например, переменная называется variable. При исполнении скрипта
Код:
variable = 123;
должна вызваться какая-нибудь (скриптовая или сишная) моя функция.
Сделал классик СVariable, наследовал его от QObject, перекрыл оператор присваивания operator=(int). Добавил в скриптИнжин объект СVariable с именем variable. Всё хорошо – скрипт говорит, что такая переменная объявлена. Но во время исполнения скрипта
Код:
variable = 123;
не вызывается моя функция, а в скриптИнжине создаётся переменная типа int, с именем variable.

Код:
class СVariable: public QObject
{
Q_OBJECT
public:
СVariable (CMyData * _data, QObject * _parent = 0) : QObject(_parent) { m_data = _data; }
~ СVariable() {}
operator int()
{
return m_data->var;
}
СVariable & operator=(const int _var)
{
m_data->var = _ var;
return *this;
}
protected:
CMyData * m_data;
};

void f()
{
СVariable * var = new СVariable (&data);
QScriptValue ScriptElem = ScriptEngine->newQObject(var);   
if (!ScriptElem.isNull())
{
m_ScriptEngine ->globalObject().setProperty(variable,ScriptElem)
}
QScriptValue  sv = m_ScriptEngine->evaluate("variable");
  sv.isObject(); // dвозвращает true
  QString script = "variable = 12564;";
  sv = m_ScriptEngine->evaluate(script);
  sv.isError(); // всё нормально
  sv = m_ScriptEngine->evaluate("variable");
  sv.isObject(); // возвращает false
}


Название: Re: "Умные" переменные в срипте
Отправлено: yoyo от Октябрь 01, 2008, 09:18
Первое, что бросается в глаза:
  m_ScriptEngine ->globalObject().setProperty(variable,ScriptElem)
может надо:
  m_ScriptEngine ->globalObject().setProperty("variable",ScriptElem)
Второе, опять же не уверен, переопределение оператора присваивания для своего объекта никак не связано с операцией присваивания в скрипте. Поэтому следует, например, расширить свой объект свойством
  Q_PROPERTY(int val WRITE setVal READ getVal)
и обращаться к объекту variable.val = 123;


Название: Re: "Умные" переменные в срипте
Отправлено: SASA от Октябрь 09, 2008, 11:34
Цитировать
Первое, что бросается в глаза:
  m_ScriptEngine ->globalObject().setProperty(variable,ScriptElem)
может надо:
  m_ScriptEngine ->globalObject().setProperty("variable",ScriptElem)
Да, конечно. Это просто описка.
Цитировать
Поэтому следует, например, расширить свой объект свойством
  Q_PROPERTY(int val WRITE setVal READ getVal)
и обращаться к объекту variable.val = 123;
К сожалению, этот способ не подходит.

Я уже склонен думать о невозможности создания таких переменных. Т.к. скриптовый язык не типизирован. Пытался читать стандарт языка – ни чего не понял.
Пишу в надежде, что кто-то просветит.:)


Название: Re: "Умные" переменные в срипте
Отправлено: ритт от Октябрь 09, 2008, 14:59
> кто-то просветит
рентгеном, что ли? )

согласен. фича была бы полезна - кто-нибудь хочет отправить саггест троллям? :)

как-то не придёмывается как эту задачу можно решить по-умному, зато вмиг придумалось как решить тупо :)
таймер

упд. только что подумалось, что в в ас2/3 можно делать такое, но для этого нужно запустить слежение за неким свойством (все переменные там фактически являются свойствами рута или контекста). а слежение-то по сути и есть сеттер+геттер+таймер+сигнал :)


Название: Re: "Умные" переменные в срипте
Отправлено: SASA от Октябрь 09, 2008, 18:43
А что-такое ас2/3???


Название: Re: "Умные" переменные в срипте
Отправлено: ритт от Октябрь 09, 2008, 18:57
"акшен скрипт" (или "актив скрипт"?) - убогий скриптовый язык, используемый в технологии флэш


Название: Re: "Умные" переменные в срипте
Отправлено: Tonal от Октябрь 09, 2008, 19:11
Вообще-то вырос из того же стандарта, что и QScript, так что не сильно и убог. :)


Название: Re: "Умные" переменные в срипте
Отправлено: ритт от Октябрь 09, 2008, 19:15
я бы не ставил ас и кускрипт в один ряд :)
ни по функциональности, ни по производительности ас и рядом не валялся...


Название: Re: "Умные" переменные в срипте
Отправлено: Tonal от Октябрь 09, 2008, 19:22
Насколько мне известно, ас3 поддерживает статическую типизацию а в кускрипте только динамическая.
Так что сравнивать их действительно не следует.
Про производительность - страно. Народ на ас пишет довольно серьёзные приложения.Да и в Адобе не дохи сплошные сидят...
Можешь какие-нибудь цифры привести по сравнению производительности?


Название: Re: "Умные" переменные в срипте
Отправлено: ритт от Октябрь 09, 2008, 23:17
не, я не собираюсь доказывать что-то и меряться...ну, чем обычно меряются :)
мне бы тогда пришлось сейчас всё бросить на несколько часов и написать пару тестиков, а это не то и к теме не относится.
если нтересно, набросай сам: например, отрисовка миллиона отрезков/квадратиков/треугольничков на канве размером 20К*20К пикселей...или хотя бы 10К мувиков из магазина на той же поверхности :)

ас3 несомненно стал лучше своего предшественника, но гроб ему - будущее...


Название: Re: "Умные" переменные в срипте
Отправлено: Tonal от Октябрь 10, 2008, 07:16
Уж офтопить, так офтопить. :)

Я спросил не в смысле чем-то мерятся, просто удивило (меня не тот не другой пока не сильно колышат - я на python-е сижу). И возникло некоторое подозрение, что сравнивалось несколько не то и не с тем...

Я твою фразочку понял в смысле сравнения самих языков, их фичь и их интерпретаторов, без "внешних" библиотек.
Например набросать на обоих какую-нибудь трассировку луча и сравнить понятность кода, его объём и скорость выполнения.

А про предложенный тобой тест - как-то не срастается. Мне трудно на вскидку представить в Qt аналог флешового мувика. Да и примитивы в Qt как мне кажется изрядно "примитивнее" чем во флеше.

Это всё равно как сравнивать пилу с топором - пила лучше топора, потому как фиг ты с помощью топора так быстро получишь так много таких мелких опилок. :)


Название: Re: "Умные" переменные в срипте
Отправлено: ритт от Октябрь 10, 2008, 07:54
гут, пофлудим. ветку потом почищу...

уж про трассировку луча не знаю, а "внешний" функционал что здесь, что там.
флэш как бы заточен под графику, но на графике же и показывает плачевные результаты. пример выше я привёл со злым умыслом :)
дело в том, что даже 10К объектов будет строиться довольно продолжительное время, а памяти съест сколько приспичит. единственный выход - рисовать сканлайном, но и то при размерах полотна хотя бы 20К*20К пикселей тормозить будет конкретно.

ну, а если отбросить "внешний" функционал, то мне порой хотелось дать в рожу хоть кому-нибудь из адобовцев :)
однажды несколько часов потратили, выясняя отчего происходит такой парадокс: создаём мувик, снимаем с него маску в битмап, накладываем на битмап-подложку, который установлен источником большого мувика (мувик действительно большой и таким образом хотели ограничить рабочую зону до размеров видимой части), затем удаляем временный битмап (или рисуем на нём, пока нужно, и удаляем), удаляем временный мувик (рабочую область). после каждой такой операции отжиралось по 15 метров оперативы...и рекурсивное удаление всего-подряд до самого рута почти ничего не дало. в результате было решено забить на оптимизацию по скорости, раз она требует таких жертв :)
сейчас уже не смогу вспомнить было это на ас2 или на ас3, но было )

зы. а ещё ас2/3 нельзя научить работать с другими скриптованными языками, а кускрипт - можно :)


Название: Re: "Умные" переменные в срипте
Отправлено: Tonal от Октябрь 10, 2008, 13:56
Сдаётся мне, что вы какой-то GIS или сложный CAD делали.
Только зачем всё это надо было делать средствами флеша?
Флешь как бы на красочную переносимую веб анимацию заточен, типа как здесь: http://vedma.net.ru/
Т.к. веб, то предполагается сервер. Вот на сервер и нужно всю обработку больших объёмов данных скидывать, чтобы на клиента уже только то что нужно в подготовленном виде по запросу вываливалось.

Ну и таки не нужно смешивать язык и среду, хотя в для флеша они очень сильно увязаны. :)


Название: Re: "Умные" переменные в срипте
Отправлено: ритт от Октябрь 10, 2008, 17:08
Цитировать
Т.к. веб, то предполагается сервер. Вот на сервер и нужно всю обработку больших объёмов данных скидывать, чтобы на клиента уже только то что нужно в подготовленном виде по запросу вываливалось.

так и было :)
флэшка получала уже обработанные данные, оптимизированные полигоны, центральные точки объектов...единственной задачей флэшки было (и есть до сих пор) - отображение этих данных, взаимодействие с пользователем. на ас3 уже писали третью версию, первые две были на ас2; первая версия работала только с растром - всё тормозило, вторую научили работать в растром и вектором, от растра почти ушли - всё тормозило и даже жрало больше памяти(!); третью версию перевели на новое ядро (всё переписали на ас3), практически полностью ушли от растра (не считая статичных объектов) - тормозов стало заметно меньше и с большим рабочим пространством оперировать уже можно более-менее терпимо...и сдаётся мне, что этот ужас будет минимум до ас5 :)
и плюс ещё ко всем этим недугам из-за убогости реализации многих механизмов флэша пришлось связать флэшку с хтмлкой, цсс/жс и либой аякса на жс.
и ещё меня вечно раздражает, что так сразу никогда не догадаешься с чем работаешь - с указателем на объект или с самим объектом...не дай божа оставишь входную переменную нетипизированной - дыра...и т.д., и т.п.

я понимаю, что это уже совсем далеко от темы, но всё же...:)

пора уже чистить ветку или ещё посплетничаем? :))


Название: Re: "Умные" переменные в срипте
Отправлено: Detonator от Ноябрь 14, 2008, 10:43
Здравствуйте.
Появилась необходимость добавить в скриптИнжин переменную, и отслеживать её изменение. Например, переменная называется variable. При исполнении скрипта
Код:
variable = 123;
должна вызваться какая-нибудь (скриптовая или сишная) моя функция.

Это можно сделать, даже разными способами, если еще интересуеет объясню как.


Название: Re: "Умные" переменные в срипте
Отправлено: SASA от Ноябрь 15, 2008, 17:26
Это можно сделать, даже разными способами, если еще интересуеет объясню как.

Конечно!!!!!!!!!!!!!!!

Я, правда, придумал способ, но только один . Собирался написать как я сделал это.


Название: Re: "Умные" переменные в срипте
Отправлено: Detonator от Ноябрь 15, 2008, 18:33
1) можно установить set-метод на это свойство
QScriptValue::setProperty(name, value, QScriptValue::PropertySetter)
2) можно подсунуть объекту (global или activated или this, как вам больше нравится) в качестве фонового QObject с нужным свойством:
QScriptEngine::newQObject(scriptObject, qtObject)
3) можно установить объекту QScriptClass и обрабатывать присваивание/чтение руками
QScriptValue::setScriptClass(scriptClass)


У себя я пошел путем 2), абсолютно всем объектам вешаваю фоновый объект производный от QObject который отслеживает изменения всех свойств. Заодно у всех объектов теперь появился сигнал updated(), который срабатывает при изменении любого свойства, и дополнительные методы которые позволяют проверить какое именно свойство было изменено и какое было старое значение этого свойства.


Название: Re: "Умные" переменные в срипте
Отправлено: SASA от Ноябрь 17, 2008, 10:24
Я пошёл путём номер раз.Скоро напишу подробно.
Про три - а как это? В двух словах.
Про два - подробней можно. С примерчиком.


Название: Re: "Умные" переменные в срипте
Отправлено: Detonator от Ноябрь 17, 2008, 12:05
Ну в документации же все описано, смотри подробности функций которые я привел.