Russian Qt Forum
Ноябрь 22, 2024, 11:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: "Умные" переменные в срипте  (Прочитано 15626 раз)
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
}
Записан
yoyo
Гость
« Ответ #1 : Октябрь 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;
Записан
SASA
Гость
« Ответ #2 : Октябрь 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;
К сожалению, этот способ не подходит.

Я уже склонен думать о невозможности создания таких переменных. Т.к. скриптовый язык не типизирован. Пытался читать стандарт языка – ни чего не понял.
Пишу в надежде, что кто-то просветит.Улыбающийся
Записан
ритт
Гость
« Ответ #3 : Октябрь 09, 2008, 14:59 »

> кто-то просветит
рентгеном, что ли? )

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

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

упд. только что подумалось, что в в ас2/3 можно делать такое, но для этого нужно запустить слежение за неким свойством (все переменные там фактически являются свойствами рута или контекста). а слежение-то по сути и есть сеттер+геттер+таймер+сигнал Улыбающийся
« Последнее редактирование: Октябрь 09, 2008, 15:09 от Константин » Записан
SASA
Гость
« Ответ #4 : Октябрь 09, 2008, 18:43 »

А что-такое ас2/3???
Записан
ритт
Гость
« Ответ #5 : Октябрь 09, 2008, 18:57 »

"акшен скрипт" (или "актив скрипт"?) - убогий скриптовый язык, используемый в технологии флэш
Записан
Tonal
Гость
« Ответ #6 : Октябрь 09, 2008, 19:11 »

Вообще-то вырос из того же стандарта, что и QScript, так что не сильно и убог. Улыбающийся
Записан
ритт
Гость
« Ответ #7 : Октябрь 09, 2008, 19:15 »

я бы не ставил ас и кускрипт в один ряд Улыбающийся
ни по функциональности, ни по производительности ас и рядом не валялся...
Записан
Tonal
Гость
« Ответ #8 : Октябрь 09, 2008, 19:22 »

Насколько мне известно, ас3 поддерживает статическую типизацию а в кускрипте только динамическая.
Так что сравнивать их действительно не следует.
Про производительность - страно. Народ на ас пишет довольно серьёзные приложения.Да и в Адобе не дохи сплошные сидят...
Можешь какие-нибудь цифры привести по сравнению производительности?
Записан
ритт
Гость
« Ответ #9 : Октябрь 09, 2008, 23:17 »

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

ас3 несомненно стал лучше своего предшественника, но гроб ему - будущее...
Записан
Tonal
Гость
« Ответ #10 : Октябрь 10, 2008, 07:16 »

Уж офтопить, так офтопить. Улыбающийся

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

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

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

Это всё равно как сравнивать пилу с топором - пила лучше топора, потому как фиг ты с помощью топора так быстро получишь так много таких мелких опилок. Улыбающийся
« Последнее редактирование: Октябрь 10, 2008, 07:18 от Tonal » Записан
ритт
Гость
« Ответ #11 : Октябрь 10, 2008, 07:54 »

гут, пофлудим. ветку потом почищу...

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

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

зы. а ещё ас2/3 нельзя научить работать с другими скриптованными языками, а кускрипт - можно Улыбающийся
Записан
Tonal
Гость
« Ответ #12 : Октябрь 10, 2008, 13:56 »

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

Ну и таки не нужно смешивать язык и среду, хотя в для флеша они очень сильно увязаны. Улыбающийся
Записан
ритт
Гость
« Ответ #13 : Октябрь 10, 2008, 17:08 »

Цитировать
Т.к. веб, то предполагается сервер. Вот на сервер и нужно всю обработку больших объёмов данных скидывать, чтобы на клиента уже только то что нужно в подготовленном виде по запросу вываливалось.

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

я понимаю, что это уже совсем далеко от темы, но всё же...Улыбающийся

пора уже чистить ветку или ещё посплетничаем? Улыбающийся)
Записан
Detonator
Гость
« Ответ #14 : Ноябрь 14, 2008, 10:43 »

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

Это можно сделать, даже разными способами, если еще интересуеет объясню как.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 21.